diff --git a/.run/WPMangaStreamGenerator.run.xml b/.run/MangaThemesiaGenerator.run.xml
similarity index 74%
rename from .run/WPMangaStreamGenerator.run.xml
rename to .run/MangaThemesiaGenerator.run.xml
index 341c39572..ed0bb0584 100644
--- a/.run/WPMangaStreamGenerator.run.xml
+++ b/.run/MangaThemesiaGenerator.run.xml
@@ -1,11 +1,11 @@
 <component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="WPMangaStreamGenerator" type="JetRunConfigurationType" nameIsGenerated="true">
+  <configuration default="false" name="MangaThemesiaGenerator" type="JetRunConfigurationType" nameIsGenerated="true">
     <module name="tachiyomi-extensions.multisrc.main" />
-    <option name="MAIN_CLASS_NAME" value="eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStreamGenerator" />
+    <option name="MAIN_CLASS_NAME" value="eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesiaGenerator" />
     <method v="2">
       <option name="Make" enabled="true" />
-      <option name="Gradle.BeforeRunTask" enabled="true" tasks="ktFormat" externalProjectPath="$PROJECT_DIR$/multisrc" vmOptions="" scriptParameters="-Ptheme=wpmangastream" />
-      <option name="Gradle.BeforeRunTask" enabled="true" tasks="ktLint" externalProjectPath="$PROJECT_DIR$/multisrc" vmOptions="" scriptParameters="-Ptheme=wpmangastream" />
+      <option name="Gradle.BeforeRunTask" enabled="true" tasks="ktFormat" externalProjectPath="$PROJECT_DIR$/multisrc" vmOptions="" scriptParameters="-Ptheme=mangathemesia" />
+      <option name="Gradle.BeforeRunTask" enabled="true" tasks="ktLint" externalProjectPath="$PROJECT_DIR$/multisrc" vmOptions="" scriptParameters="-Ptheme=mangathemesia" />
     </method>
   </configuration>
 </component>
diff --git a/.run/WpMangaReaderGenerator.run.xml b/.run/WpMangaReaderGenerator.run.xml
deleted file mode 100644
index b8da10d7e..000000000
--- a/.run/WpMangaReaderGenerator.run.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="WPMangaReaderGenerator" type="JetRunConfigurationType" nameIsGenerated="true">
-    <module name="tachiyomi-extensions.multisrc.main" />
-    <option name="MAIN_CLASS_NAME" value="eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReaderGenerator" />
-    <method v="2">
-      <option name="Make" enabled="true" />
-      <option name="Gradle.BeforeRunTask" enabled="true" tasks="ktFormat" externalProjectPath="$PROJECT_DIR$/multisrc" vmOptions="" scriptParameters="-Ptheme=wpmangareader" />
-      <option name="Gradle.BeforeRunTask" enabled="true" tasks="ktLint" externalProjectPath="$PROJECT_DIR$/multisrc" vmOptions="" scriptParameters="-Ptheme=wpmangareader" />
-    </method>
-  </configuration>
-</component>
diff --git a/multisrc/overrides/wpmangareader/acescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/acescans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/acescans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/acescans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/acescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/acescans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/acescans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/acescans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/acescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/acescans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/acescans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/acescans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/acescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/acescans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/acescans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/acescans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/acescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/acescans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/acescans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/acescans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/acescans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/acescans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/acescans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/acescans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/acescans/src/AceScans.kt b/multisrc/overrides/mangathemesia/acescans/src/AceScans.kt
new file mode 100644
index 000000000..2611d16e2
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/acescans/src/AceScans.kt
@@ -0,0 +1,5 @@
+package eu.kanade.tachiyomi.extension.en.acescans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class AceScans : MangaThemesia("Ace Scans", "https://acescans.xyz", "en")
diff --git a/multisrc/overrides/wpmangareader/alphascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alphascans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/alphascans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/alphascans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/alphascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alphascans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/alphascans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/alphascans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/alphascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alphascans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/alphascans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/alphascans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/alphascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alphascans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/alphascans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/alphascans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/alphascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alphascans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/alphascans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/alphascans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/alphascans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/alphascans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/alphascans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/alphascans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/alphascans/src/AlphaScans.kt b/multisrc/overrides/mangathemesia/alphascans/src/AlphaScans.kt
similarity index 97%
rename from multisrc/overrides/wpmangareader/alphascans/src/AlphaScans.kt
rename to multisrc/overrides/mangathemesia/alphascans/src/AlphaScans.kt
index 20ba742f3..db5353763 100644
--- a/multisrc/overrides/wpmangareader/alphascans/src/AlphaScans.kt
+++ b/multisrc/overrides/mangathemesia/alphascans/src/AlphaScans.kt
@@ -4,7 +4,7 @@ import android.app.Application
 import android.content.SharedPreferences
 import androidx.preference.PreferenceScreen
 import androidx.preference.SwitchPreferenceCompat
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.source.ConfigurableSource
 import eu.kanade.tachiyomi.source.model.FilterList
 import eu.kanade.tachiyomi.source.model.MangasPage
@@ -14,7 +14,7 @@ import rx.Observable
 import uy.kohesive.injekt.Injekt
 import uy.kohesive.injekt.api.get
 
-open class AlphaScans : WPMangaReader("Alpha Scans", "https://alpha-scans.org", "en"), ConfigurableSource {
+open class AlphaScans : MangaThemesia("Alpha Scans", "https://alpha-scans.org", "en"), ConfigurableSource {
 
     private val preferences: SharedPreferences by lazy {
         Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
diff --git a/multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/animatedglitchedscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/animatedglitchedscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/animatedglitchedscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/animatedglitchedscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/animatedglitchedscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/animatedglitchedscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/animatedglitchedscans/src/AnimatedGlitchedScans.kt b/multisrc/overrides/mangathemesia/animatedglitchedscans/src/AnimatedGlitchedScans.kt
new file mode 100644
index 000000000..d70c658f1
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/animatedglitchedscans/src/AnimatedGlitchedScans.kt
@@ -0,0 +1,5 @@
+package eu.kanade.tachiyomi.extension.en.animatedglitchedscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class AnimatedGlitchedScans : MangaThemesia("Animated Glitched Scans", "https://anigliscans.com", "en", mangaUrlDirectory = "/series")
diff --git a/multisrc/overrides/wpmangareader/anitationarts/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/anitationarts/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/anitationarts/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/anitationarts/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/anitationarts/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/anitationarts/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/anitationarts/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/anitationarts/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/anitationarts/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/anitationarts/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/anitationarts/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/anitationarts/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/anitationarts/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/anitationarts/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/anitationarts/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/anitationarts/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/anitationarts/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/anitationarts/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/anitationarts/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/anitationarts/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/anitationarts/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/anitationarts/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/anitationarts/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/anitationarts/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/arcanescan/src/Arcanescan.kt b/multisrc/overrides/mangathemesia/arcanescan/src/Arcanescan.kt
similarity index 70%
rename from multisrc/overrides/wpmangareader/arcanescan/src/Arcanescan.kt
rename to multisrc/overrides/mangathemesia/arcanescan/src/Arcanescan.kt
index 61fd960b8..853860a5e 100644
--- a/multisrc/overrides/wpmangareader/arcanescan/src/Arcanescan.kt
+++ b/multisrc/overrides/mangathemesia/arcanescan/src/Arcanescan.kt
@@ -1,10 +1,10 @@
 package eu.kanade.tachiyomi.extension.fr.arcanescan
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class Arcanescan : WPMangaReader(
+class Arcanescan : MangaThemesia(
     "Arcane scan",
     "https://arcanescan.fr",
     "fr",
diff --git a/multisrc/overrides/wpmangastream/asurascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/asurascans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/asurascans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/asurascans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/asurascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/asurascans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/asurascans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/asurascans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/asurascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/asurascans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/asurascans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/asurascans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/asurascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/asurascans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/asurascans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/asurascans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/asurascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/asurascans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/asurascans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/asurascans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/asurascans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/asurascans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/asurascans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/asurascans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/asurascans/src/AsuraScans.kt b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScans.kt
similarity index 97%
rename from multisrc/overrides/wpmangastream/asurascans/src/AsuraScans.kt
rename to multisrc/overrides/mangathemesia/asurascans/src/AsuraScans.kt
index dcd0c04e8..29b599102 100644
--- a/multisrc/overrides/wpmangastream/asurascans/src/AsuraScans.kt
+++ b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScans.kt
@@ -4,7 +4,7 @@ import android.app.Application
 import android.content.SharedPreferences
 import androidx.preference.PreferenceScreen
 import androidx.preference.SwitchPreferenceCompat
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import eu.kanade.tachiyomi.source.ConfigurableSource
 import eu.kanade.tachiyomi.source.model.FilterList
@@ -21,11 +21,11 @@ open class AsuraScans(
     override val baseUrl: String,
     override val lang: String,
     dateFormat: SimpleDateFormat
-) : WPMangaStream(
+) : MangaThemesia(
     "Asura Scans",
     baseUrl,
     lang,
-    dateFormat
+    dateFormat = dateFormat
 ),
     ConfigurableSource {
 
diff --git a/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansFactory.kt b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansFactory.kt
new file mode 100644
index 000000000..179034132
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansFactory.kt
@@ -0,0 +1,46 @@
+package eu.kanade.tachiyomi.extension.all.asurascans
+
+import eu.kanade.tachiyomi.source.SourceFactory
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SManga
+import org.jsoup.nodes.Document
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class AsuraScansFactory : SourceFactory {
+    override fun createSources() = listOf(
+        AsuraScansEn(),
+        AsuraScansTr()
+    )
+}
+
+class AsuraScansEn : AsuraScans("https://www.asurascans.com", "en", SimpleDateFormat("MMM d, yyyy", Locale.US)) {
+
+    override val seriesDescriptionSelector = "div.desc p, div.entry-content p, div[itemprop=description]:not(:has(p))"
+
+    override val pageSelector = "div.rdminimal > img, div.rdminimal > p > img, div.rdminimal > a > img, div.rdminimal > p > a > img"
+
+    // Skip scriptPages
+    override fun pageListParse(document: Document): List<Page> {
+        return document.select(pageSelector)
+            .filterNot { it.attr("src").isNullOrEmpty() }
+            .mapIndexed { i, img -> Page(i, "", img.attr("src")) }
+    }
+}
+
+class AsuraScansTr : AsuraScans("https://tr.asurascans.com", "tr", SimpleDateFormat("MMM d, yyyy", Locale("tr"))) {
+
+    override val seriesArtistSelector = ".fmed b:contains(Çizer)+span"
+    override val seriesAuthorSelector = ".fmed b:contains(Yazar)+span"
+    override val seriesStatusSelector = ".imptdt:contains(Durum) i"
+    override val seriesTypeSelector = ".imptdt:contains(Tür) a"
+
+    override val altNamePrefix: String = "Alternatif isim: "
+
+    override fun String?.parseStatus(): Int = when {
+        this == null -> SManga.UNKNOWN
+        this.contains("Devam Ediyor", ignoreCase = true) -> SManga.ONGOING
+        this.contains("Tamamlandı", ignoreCase = true) -> SManga.COMPLETED
+        else -> SManga.UNKNOWN
+    }
+}
diff --git a/multisrc/overrides/wpmangareader/azurescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/azurescans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/azurescans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/azurescans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/azurescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/azurescans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/azurescans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/azurescans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/azurescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/azurescans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/azurescans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/azurescans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/azurescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/azurescans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/azurescans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/azurescans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/azurescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/azurescans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/azurescans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/azurescans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/azurescans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/azurescans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/azurescans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/azurescans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/batotoscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/batotoscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/batotoscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/batotoscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/batotoscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/batotoscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/batotoscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/batotoscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/batotoscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/batotoscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/batotoscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/batotoscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/batotoscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/batotoscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/batotoscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/batotoscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/batotoscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/batotoscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/batotoscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/batotoscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/batotoscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/batotoscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/batotoscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/batotoscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/batotoscans/src/BatotoScans.kt b/multisrc/overrides/mangathemesia/batotoscans/src/BatotoScans.kt
new file mode 100644
index 000000000..9e2a14c6a
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/batotoscans/src/BatotoScans.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.en.batotoscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class BatotoScans : MangaThemesia("Snudae Scans", "https://snudaescans.com", "en") {
+    override val id = 4418350353197826372L
+}
diff --git a/multisrc/overrides/wpmangareader/beastscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/beastscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/beastscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/beastscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/beastscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/beastscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/beastscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/beastscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/beastscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/beastscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/beastscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/beastscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/beastscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/beastscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/beastscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/beastscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/beastscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/boosei/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/boosei/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/boosei/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/boosei/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/boosei/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/boosei/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/boosei/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/boosei/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/boosei/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/boosei/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/boosei/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/boosei/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/boosei/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/boosei/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/boosei/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/boosei/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/boosei/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/boosei/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/boosei/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/boosei/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/boosei/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/boosei/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/boosei/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/boosei/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/boosei/src/Boosei.kt b/multisrc/overrides/mangathemesia/boosei/src/Boosei.kt
similarity index 76%
rename from multisrc/overrides/wpmangastream/boosei/src/Boosei.kt
rename to multisrc/overrides/mangathemesia/boosei/src/Boosei.kt
index 75a550927..025718bce 100644
--- a/multisrc/overrides/wpmangastream/boosei/src/Boosei.kt
+++ b/multisrc/overrides/mangathemesia/boosei/src/Boosei.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.id.boosei
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class Boosei : WPMangaStream("Boosei", "https://boosei.com", "id") {
+class Boosei : MangaThemesia("Boosei", "https://boosei.com", "id") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangastream/default/AndroidManifest.xml b/multisrc/overrides/mangathemesia/default/AndroidManifest.xml
similarity index 93%
rename from multisrc/overrides/wpmangastream/default/AndroidManifest.xml
rename to multisrc/overrides/mangathemesia/default/AndroidManifest.xml
index d408e9008..ded43d296 100644
--- a/multisrc/overrides/wpmangastream/default/AndroidManifest.xml
+++ b/multisrc/overrides/mangathemesia/default/AndroidManifest.xml
@@ -4,7 +4,7 @@
 
     <application>
         <activity
-            android:name="eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStreamUrlActivity"
+            android:name="eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesiaUrlActivity"
             android:excludeFromRecents="true"
             android:exported="true"
             android:theme="@android:style/Theme.NoDisplay">
diff --git a/multisrc/overrides/wpmangareader/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/default/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/default/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/default/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/default/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/default/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/default/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/default/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/default/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/default/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/default/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/default/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/default/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/default/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/default/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/default/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/default/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/default/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/default/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/default/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/flamescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamescans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/flamescans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamescans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/flamescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamescans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/flamescans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamescans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/flamescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamescans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/flamescans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamescans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/flamescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamescans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/flamescans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamescans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/flamescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamescans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/flamescans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamescans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/flamescans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/flamescans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/flamescans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/flamescans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/flamescans/src/FlameScans.kt b/multisrc/overrides/mangathemesia/flamescans/src/FlameScans.kt
similarity index 99%
rename from multisrc/overrides/wpmangareader/flamescans/src/FlameScans.kt
rename to multisrc/overrides/mangathemesia/flamescans/src/FlameScans.kt
index 929a17601..b581e18b4 100644
--- a/multisrc/overrides/wpmangareader/flamescans/src/FlameScans.kt
+++ b/multisrc/overrides/mangathemesia/flamescans/src/FlameScans.kt
@@ -8,7 +8,7 @@ import android.graphics.Canvas
 import android.graphics.Rect
 import androidx.preference.PreferenceScreen
 import androidx.preference.SwitchPreferenceCompat
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.source.ConfigurableSource
 import eu.kanade.tachiyomi.source.model.FilterList
 import eu.kanade.tachiyomi.source.model.MangasPage
@@ -35,7 +35,7 @@ open class FlameScans(
     override val lang: String,
     mangaUrlDirectory: String,
     dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US)
-) : WPMangaReader(
+) : MangaThemesia(
     "Flame Scans",
     baseUrl,
     lang,
diff --git a/multisrc/overrides/wpmangareader/flamescans/src/FlameScansFactory.kt b/multisrc/overrides/mangathemesia/flamescans/src/FlameScansFactory.kt
similarity index 82%
rename from multisrc/overrides/wpmangareader/flamescans/src/FlameScansFactory.kt
rename to multisrc/overrides/mangathemesia/flamescans/src/FlameScansFactory.kt
index 85a4e6f2a..dd7bb7c13 100644
--- a/multisrc/overrides/wpmangareader/flamescans/src/FlameScansFactory.kt
+++ b/multisrc/overrides/mangathemesia/flamescans/src/FlameScansFactory.kt
@@ -20,9 +20,10 @@ class FlameScansAr : FlameScans("https://ar.flamescans.org", "ar", "/series") {
 
     override val id: Long = 6053688312544266540
 
-    override fun parseStatus(status: String) = when {
-        status.contains("مستمر") -> SManga.ONGOING
-        status.contains("مكتمل") -> SManga.COMPLETED
+    override fun String?.parseStatus() = when {
+        this == null -> SManga.UNKNOWN
+        this.contains("مستمر") -> SManga.ONGOING
+        this.contains("مكتمل") -> SManga.COMPLETED
         else -> SManga.UNKNOWN
     }
 }
diff --git a/multisrc/overrides/wpmangareader/franxxmangas/src/FranxxMangas.kt b/multisrc/overrides/mangathemesia/franxxmangas/src/FranxxMangas.kt
similarity index 51%
rename from multisrc/overrides/wpmangareader/franxxmangas/src/FranxxMangas.kt
rename to multisrc/overrides/mangathemesia/franxxmangas/src/FranxxMangas.kt
index ecd79f2df..2ecb426bd 100644
--- a/multisrc/overrides/wpmangareader/franxxmangas/src/FranxxMangas.kt
+++ b/multisrc/overrides/mangathemesia/franxxmangas/src/FranxxMangas.kt
@@ -1,15 +1,13 @@
 package eu.kanade.tachiyomi.extension.pt.franxxmangas
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.SManga
 import okhttp3.OkHttpClient
-import org.jsoup.nodes.Element
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class FranxxMangas : WPMangaReader(
+class FranxxMangas : MangaThemesia(
     "Franxx Mangás",
     "https://franxxmangas.net",
     "pt-BR",
@@ -20,11 +18,5 @@ class FranxxMangas : WPMangaReader(
         .rateLimit(1, 2, TimeUnit.SECONDS)
         .build()
 
-    override val altName = "Nomes alternativos: "
-
-    override fun searchMangaFromElement(element: Element) = SManga.create().apply {
-        thumbnail_url = element.select("img").attr("abs:data-src")
-        title = element.select("a").attr("title")
-        setUrlWithoutDomain(element.select("a").attr("href"))
-    }
+    override val altNamePrefix = "Nomes alternativos: "
 }
diff --git a/multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/fusionscanlation/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/fusionscanlation/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/fusionscanlation/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/fusionscanlation/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/fusionscanlation/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/fusionscanlation/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/fusionscanlation/src/FusionScanlation.kt b/multisrc/overrides/mangathemesia/fusionscanlation/src/FusionScanlation.kt
similarity index 81%
rename from multisrc/overrides/wpmangareader/fusionscanlation/src/FusionScanlation.kt
rename to multisrc/overrides/mangathemesia/fusionscanlation/src/FusionScanlation.kt
index 5cad1c76f..49aa928f4 100644
--- a/multisrc/overrides/wpmangareader/fusionscanlation/src/FusionScanlation.kt
+++ b/multisrc/overrides/mangathemesia/fusionscanlation/src/FusionScanlation.kt
@@ -1,13 +1,13 @@
 package eu.kanade.tachiyomi.extension.es.fusionscanlation
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class FusionScanlation : WPMangaReader("Fusion Scanlation", "https://fusionscanlation.com", "es", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es"))) {
+class FusionScanlation : MangaThemesia("Fusion Scanlation", "https://fusionscanlation.com", "es", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es"))) {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangareader/gabutscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gabutscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/gabutscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gabutscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/gabutscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gabutscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/gabutscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gabutscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/gabutscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gabutscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/gabutscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gabutscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/gabutscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gabutscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/gabutscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gabutscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/gabutscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gabutscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/gabutscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gabutscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/gabutscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/gabutscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/gabutscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/gabutscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/gabutscans/src/GabutScans.kt b/multisrc/overrides/mangathemesia/gabutscans/src/GabutScans.kt
similarity index 64%
rename from multisrc/overrides/wpmangareader/gabutscans/src/GabutScans.kt
rename to multisrc/overrides/mangathemesia/gabutscans/src/GabutScans.kt
index 9ade9db66..2140b2ecf 100644
--- a/multisrc/overrides/wpmangareader/gabutscans/src/GabutScans.kt
+++ b/multisrc/overrides/mangathemesia/gabutscans/src/GabutScans.kt
@@ -1,37 +1,27 @@
 package eu.kanade.tachiyomi.extension.id.gabutscans
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.source.model.Page
 import kotlinx.serialization.json.jsonArray
 import kotlinx.serialization.json.jsonPrimitive
 import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class GabutScans : WPMangaReader(
+class GabutScans : MangaThemesia(
     "Gabut Scans", "https://gabutscans.com", "id",
     dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id"))
 ) {
 
     override val hasProjectPage = true
 
-    override fun searchMangaFromElement(element: Element) =
-        super.searchMangaFromElement(element).apply {
-            thumbnail_url = element.select("img").attr("abs:data-src")
-        }
-
-    override fun mangaDetailsParse(document: Document) = super.mangaDetailsParse(document).apply {
-        thumbnail_url = document.select(seriesThumbnailSelector).attr("abs:data-src")
-    }
-
     override fun pageListParse(document: Document): List<Page> {
         // Prefer using sources loaded from javascript
         // because current CDN (Statically) can't load old images.
         // Example: https://gabutscans.com/cinderella-wa-sagasanai-chapter-41-end-bahasa-indonesia/
 
         val docString = document.toString()
-        val imageListRegex = Regex("""\"images.*?:.*?(\[.*?])""")
+        val imageListRegex = Regex("\"images.*?:.*?(\\[.*?])")
         val (imageListJson) = imageListRegex.find(docString)!!.destructured
 
         val imageList = json.parseToJsonElement(imageListJson).jsonArray
diff --git a/multisrc/overrides/wpmangastream/gogomanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gogomanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/gogomanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gogomanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/gogomanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gogomanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/gogomanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gogomanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/gogomanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gogomanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/gogomanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gogomanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/gogomanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gogomanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/gogomanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gogomanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/gogomanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gogomanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/gogomanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/gogomanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/gogomanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/gogomanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/gogomanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/gogomanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/iimanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/iimanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/iimanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/iimanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/iimanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/iimanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/iimanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/iimanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/iimanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/iimanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/iimanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/iimanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/iimanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/iimanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/iimanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/iimanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/iimanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/iimanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/iimanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/iimanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/iimanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/iimanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/iimanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/iimanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/iimanga/src/ARESManga.kt b/multisrc/overrides/mangathemesia/iimanga/src/ARESManga.kt
similarity index 68%
rename from multisrc/overrides/wpmangareader/iimanga/src/ARESManga.kt
rename to multisrc/overrides/mangathemesia/iimanga/src/ARESManga.kt
index 7c2bdc8aa..1b7eafc7e 100644
--- a/multisrc/overrides/wpmangareader/iimanga/src/ARESManga.kt
+++ b/multisrc/overrides/mangathemesia/iimanga/src/ARESManga.kt
@@ -1,10 +1,10 @@
 package eu.kanade.tachiyomi.extension.ar.iimanga
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class ARESManga : WPMangaReader("ARESManga", "https://aresmanga.com", "ar", dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("ar"))) {
+class ARESManga : MangaThemesia("ARESManga", "https://aresmanga.com", "ar", dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("ar"))) {
     // The scanlator changed their name.
     override val id: Long = 230017529540228175
 }
diff --git a/multisrc/overrides/wpmangastream/imaginescan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imaginescan/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imaginescan/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imaginescan/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imaginescan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imaginescan/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imaginescan/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imaginescan/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imaginescan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imaginescan/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imaginescan/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imaginescan/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imaginescan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imaginescan/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imaginescan/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imaginescan/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imaginescan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imaginescan/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imaginescan/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imaginescan/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imaginescan/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/imaginescan/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imaginescan/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/imaginescan/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/imaginescan/src/ImagineScan.kt b/multisrc/overrides/mangathemesia/imaginescan/src/ImagineScan.kt
similarity index 65%
rename from multisrc/overrides/wpmangastream/imaginescan/src/ImagineScan.kt
rename to multisrc/overrides/mangathemesia/imaginescan/src/ImagineScan.kt
index c8fc4a9c1..1b06da15e 100644
--- a/multisrc/overrides/wpmangastream/imaginescan/src/ImagineScan.kt
+++ b/multisrc/overrides/mangathemesia/imaginescan/src/ImagineScan.kt
@@ -1,22 +1,22 @@
 package eu.kanade.tachiyomi.extension.pt.imaginescan
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class ImagineScan : WPMangaStream(
+class ImagineScan : MangaThemesia(
     "Imagine Scan",
     "https://imaginescan.com.br",
     "pt-BR",
-    SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR"))
+    dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR"))
 ) {
 
     override val client: OkHttpClient = super.client.newBuilder()
         .rateLimit(1, 2, TimeUnit.SECONDS)
         .build()
 
-    override val altName: String = "Nome alternativo: "
+    override val altNamePrefix: String = "Nome alternativo: "
 }
diff --git a/multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imperfectcomics/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/imperfectcomics/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/imperfectcomics/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/imperfectcomics/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/imperfectcomics/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/imperfectcomics/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/inarimanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/inarimanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/inarimanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/inarimanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/inarimanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/inarimanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/inarimanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/inarimanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/inarimanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/inarimanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/inarimanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/inarimanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/inarimanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/inarimanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/inarimanga/src/InariManga.kt b/multisrc/overrides/mangathemesia/inarimanga/src/InariManga.kt
similarity index 70%
rename from multisrc/overrides/wpmangareader/inarimanga/src/InariManga.kt
rename to multisrc/overrides/mangathemesia/inarimanga/src/InariManga.kt
index 6150796f9..51dbd9c5e 100644
--- a/multisrc/overrides/wpmangareader/inarimanga/src/InariManga.kt
+++ b/multisrc/overrides/mangathemesia/inarimanga/src/InariManga.kt
@@ -1,10 +1,10 @@
 package eu.kanade.tachiyomi.extension.es.inarimanga
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class InariManga : WPMangaReader(
+class InariManga : MangaThemesia(
     "InariManga",
     "https://inarimanga.com",
     "es",
diff --git a/multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/infernalvoidscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/infernalvoidscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/infernalvoidscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/infernalvoidscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/infernalvoidscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/infernalvoidscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/infernalvoidscans/src/InfernalVoidScans.kt b/multisrc/overrides/mangathemesia/infernalvoidscans/src/InfernalVoidScans.kt
new file mode 100644
index 000000000..7eba18895
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/infernalvoidscans/src/InfernalVoidScans.kt
@@ -0,0 +1,5 @@
+package eu.kanade.tachiyomi.extension.en.infernalvoidscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class InfernalVoidScans : MangaThemesia("Infernal Void Scans", "https://void-scans.com", "en")
diff --git a/multisrc/overrides/wpmangareader/kiryuu/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kiryuu/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/kiryuu/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kiryuu/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/kiryuu/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kiryuu/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/kiryuu/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kiryuu/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/kiryuu/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kiryuu/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/kiryuu/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kiryuu/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/kiryuu/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kiryuu/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/kiryuu/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kiryuu/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/kiryuu/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kiryuu/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/kiryuu/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kiryuu/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/kiryuu/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/kiryuu/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/kiryuu/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/kiryuu/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/kiryuu/src/Kiryuu.kt b/multisrc/overrides/mangathemesia/kiryuu/src/Kiryuu.kt
new file mode 100644
index 000000000..1159acd18
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/kiryuu/src/Kiryuu.kt
@@ -0,0 +1,27 @@
+package eu.kanade.tachiyomi.extension.id.kiryuu
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import org.jsoup.nodes.Document
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class Kiryuu : MangaThemesia("Kiryuu", "https://kiryuu.id", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id"))) {
+    // Formerly "Kiryuu (WP Manga Stream)"
+    override val id = 3639673976007021338
+
+    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+        .connectTimeout(10, TimeUnit.SECONDS)
+        .readTimeout(30, TimeUnit.SECONDS)
+        .rateLimit(4)
+        .build()
+
+    // manga details
+    override fun mangaDetailsParse(document: Document) = super.mangaDetailsParse(document).apply {
+        title = document.selectFirst(seriesThumbnailSelector).attr("title")
+    }
+
+    override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/wpmangastream/klankomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/klankomik/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/klankomik/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/klankomik/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/klankomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/klankomik/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/klankomik/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/klankomik/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/klankomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/klankomik/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/klankomik/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/klankomik/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/klankomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/klankomik/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/klankomik/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/klankomik/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/klankomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/klankomik/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/klankomik/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/klankomik/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/klankomik/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/klankomik/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/klankomik/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/klankomik/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/klankomik/src/KlanKomik.kt b/multisrc/overrides/mangathemesia/klankomik/src/KlanKomik.kt
similarity index 77%
rename from multisrc/overrides/wpmangastream/klankomik/src/KlanKomik.kt
rename to multisrc/overrides/mangathemesia/klankomik/src/KlanKomik.kt
index 1743f75f5..d33db8a4f 100644
--- a/multisrc/overrides/wpmangastream/klankomik/src/KlanKomik.kt
+++ b/multisrc/overrides/mangathemesia/klankomik/src/KlanKomik.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.id.klankomik
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class KlanKomik : WPMangaStream("KlanKomik", "https://klankomik.com", "id") {
+class KlanKomik : MangaThemesia("KlanKomik", "https://klankomik.com", "id") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangastream/komikav/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikav/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikav/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikav/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikav/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikav/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikav/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikav/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikav/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikav/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikav/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikav/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikav/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikav/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikav/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikav/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikav/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikav/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikav/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikav/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikav/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/komikav/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikav/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/komikav/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/komikav/src/KomikAV.kt b/multisrc/overrides/mangathemesia/komikav/src/KomikAV.kt
similarity index 90%
rename from multisrc/overrides/wpmangastream/komikav/src/KomikAV.kt
rename to multisrc/overrides/mangathemesia/komikav/src/KomikAV.kt
index 61c7dc985..e31f5f527 100644
--- a/multisrc/overrides/wpmangastream/komikav/src/KomikAV.kt
+++ b/multisrc/overrides/mangathemesia/komikav/src/KomikAV.kt
@@ -1,6 +1,6 @@
 package eu.kanade.tachiyomi.extension.id.komikav
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import eu.kanade.tachiyomi.source.model.Page
@@ -10,7 +10,7 @@ import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class KomikAV : WPMangaStream(
+class KomikAV : MangaThemesia(
     "Komik AV (WP Manga Stream)",
     "https://komikav.com",
     "id",
diff --git a/multisrc/overrides/wpmangastream/komikcast/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikcast/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikcast/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikcast/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikcast/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikcast/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikcast/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikcast/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikcast/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikcast/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikcast/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikcast/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikcast/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikcast/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikcast/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikcast/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikcast/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikcast/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikcast/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikcast/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikcast/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/komikcast/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikcast/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/komikcast/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/komikcast/src/KomikCast.kt b/multisrc/overrides/mangathemesia/komikcast/src/KomikCast.kt
new file mode 100644
index 000000000..08583c65f
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/komikcast/src/KomikCast.kt
@@ -0,0 +1,89 @@
+package eu.kanade.tachiyomi.extension.id.komikcast
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.Page
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonObject
+import okhttp3.Headers
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import org.jsoup.Jsoup
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import java.util.concurrent.TimeUnit
+
+class KomikCast : MangaThemesia(
+    "Komik Cast",
+    "https://komikcast.me",
+    "id",
+    mangaUrlDirectory = "/daftar-komik"
+) {
+    // Formerly "Komik Cast (WP Manga Stream)"
+    override val id = 972717448578983812
+
+    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+        .connectTimeout(10, TimeUnit.SECONDS)
+        .readTimeout(30, TimeUnit.SECONDS)
+        .rateLimit(3)
+        .build()
+
+    override fun headersBuilder(): Headers.Builder = Headers.Builder()
+        .add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
+        .add("Accept-language", "en-US,en;q=0.9,id;q=0.8")
+        .add("Referer", baseUrl)
+        .add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0")
+
+    override fun imageRequest(page: Page): Request {
+        val newHeaders = headersBuilder()
+            .set("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
+            .set("Referer", baseUrl)
+            .build()
+
+        return GET(page.imageUrl!!, newHeaders)
+    }
+
+    override fun searchMangaSelector() = "div.list-update_item"
+
+    override fun searchMangaFromElement(element: Element) = super.searchMangaFromElement(element).apply {
+        title = element.selectFirst("h3.title").ownText()
+    }
+
+    override val seriesDetailsSelector = "div.komik_info:has(.komik_info-content)"
+    override val seriesTitleSelector = "h1.komik_info-content-body-title"
+    override val seriesDescriptionSelector = ".komik_info-description-sinopsis"
+    override val seriesAltNameSelector = ".komik_info-content-native"
+    override val seriesGenreSelector = ".komik_info-content-genre a"
+    override val seriesThumbnailSelector = ".komik_info-content-thumbnail img"
+
+    override fun chapterListSelector() = "div.komik_info-chapters li"
+
+    override fun chapterFromElement(element: Element) = super.chapterFromElement(element).apply {
+        date_upload = element.selectFirst(".chapter-link-time")?.text().parseChapterDate()
+    }
+
+    override fun pageListParse(document: Document): List<Page> {
+        var doc = document
+        var cssQuery = "div#chapter_body .main-reading-area img.size-full"
+        val imageListRegex = Regex("chapterImages = (.*) \\|\\|")
+        val imageListMatchResult = imageListRegex.find(document.toString())
+
+        if (imageListMatchResult != null) {
+            val imageListJson = imageListMatchResult.destructured.toList()[0]
+            val imageList = json.parseToJsonElement(imageListJson).jsonObject
+
+            var imageServer = "cdn"
+            if (!imageList.containsKey(imageServer)) imageServer = imageList.keys.first()
+            val imageElement = imageList[imageServer]!!.jsonArray.joinToString("")
+            doc = Jsoup.parse(json.decodeFromString(imageElement))
+            cssQuery = "img.size-full"
+        }
+
+        return doc.select(cssQuery)
+            .mapIndexed { i, img -> Page(i, "", img.imgAttr()) }
+    }
+
+    override val hasProjectPage: Boolean = true
+}
diff --git a/multisrc/overrides/wpmangastream/komikindoco/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikindoco/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikindoco/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikindoco/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikindoco/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikindoco/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikindoco/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikindoco/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikindoco/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikindoco/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikindoco/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikindoco/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikindoco/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikindoco/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikindoco/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikindoco/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikindoco/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikindoco/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikindoco/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikindoco/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikindoco/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/komikindoco/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikindoco/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/komikindoco/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/komikindoco/src/KomikindoCo.kt b/multisrc/overrides/mangathemesia/komikindoco/src/KomikindoCo.kt
new file mode 100644
index 000000000..9a6c96240
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/komikindoco/src/KomikindoCo.kt
@@ -0,0 +1,23 @@
+package eu.kanade.tachiyomi.extension.id.komikindoco
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class KomikindoCo : MangaThemesia("KomikIndo.co", "https://komikindo.co", "id", dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale("id"))) {
+    // Formerly "Komikindo.co"
+    override val id = 734619124437406170
+
+    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+        .connectTimeout(10, TimeUnit.SECONDS)
+        .readTimeout(30, TimeUnit.SECONDS)
+        .rateLimit(4)
+        .build()
+
+    override val hasProjectPage = true
+
+    override val seriesDetailsSelector = ".seriestucon"
+}
diff --git a/multisrc/overrides/wpmangareader/komiklab/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komiklab/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komiklab/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komiklab/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komiklab/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komiklab/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komiklab/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komiklab/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komiklab/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komiklab/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komiklab/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komiklab/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komiklab/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komiklab/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komiklab/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komiklab/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komiklab/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komiklab/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komiklab/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komiklab/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komiklab/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/komiklab/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komiklab/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/komiklab/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/komiklab/src/KomikLab.kt b/multisrc/overrides/mangathemesia/komiklab/src/KomikLab.kt
new file mode 100644
index 000000000..27e6701ba
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/komiklab/src/KomikLab.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.id.komiklab
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class KomikLab : MangaThemesia("Komik Lab", "https://komiklab.com", "id") {
+    override val hasProjectPage = true
+
+    override val seriesDetailsSelector = ".seriestucon"
+}
diff --git a/multisrc/overrides/wpmangareader/komikmama/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikmama/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikmama/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikmama/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikmama/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikmama/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikmama/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikmama/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikmama/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikmama/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikmama/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikmama/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikmama/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikmama/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikmama/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikmama/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikmama/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikmama/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikmama/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikmama/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikmama/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/komikmama/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikmama/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/komikmama/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/komikmama/src/KomikMama.kt b/multisrc/overrides/mangathemesia/komikmama/src/KomikMama.kt
similarity index 69%
rename from multisrc/overrides/wpmangareader/komikmama/src/KomikMama.kt
rename to multisrc/overrides/mangathemesia/komikmama/src/KomikMama.kt
index 1bd5f9159..10dd420a8 100644
--- a/multisrc/overrides/wpmangareader/komikmama/src/KomikMama.kt
+++ b/multisrc/overrides/mangathemesia/komikmama/src/KomikMama.kt
@@ -1,10 +1,10 @@
 package eu.kanade.tachiyomi.extension.id.komikmama
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class KomikMama : WPMangaReader(
+class KomikMama : MangaThemesia(
     "KomikMama", "https://komikmama.co", "id",
     dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id"))
 )
diff --git a/multisrc/overrides/wpmangastream/komikstation/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikstation/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikstation/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikstation/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikstation/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikstation/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikstation/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikstation/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikstation/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikstation/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikstation/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikstation/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikstation/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikstation/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikstation/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikstation/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikstation/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikstation/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikstation/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikstation/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/komikstation/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/komikstation/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/komikstation/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/komikstation/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/komikstation/src/KomikStation.kt b/multisrc/overrides/mangathemesia/komikstation/src/KomikStation.kt
new file mode 100644
index 000000000..51437f642
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/komikstation/src/KomikStation.kt
@@ -0,0 +1,21 @@
+package eu.kanade.tachiyomi.extension.id.komikstation
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.util.concurrent.TimeUnit
+
+class KomikStation : MangaThemesia("Komik Station", "https://komikstation.co", "id") {
+    // Formerly "Komik Station (WP Manga Stream)"
+    override val id = 6148605743576635261
+
+    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+        .connectTimeout(10, TimeUnit.SECONDS)
+        .readTimeout(30, TimeUnit.SECONDS)
+        .rateLimit(4)
+        .build()
+
+    override val projectPageString = "/project-list"
+
+    override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/wpmangareader/komikucom/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikucom/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikucom/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikucom/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikucom/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikucom/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikucom/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikucom/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikucom/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikucom/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikucom/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikucom/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikucom/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikucom/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikucom/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikucom/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikucom/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/komikucom/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikucom/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/komikucom/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/komikucom/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/komikucom/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/komikucom/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/komikucom/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/komikucom/src/KomikuCom.kt b/multisrc/overrides/mangathemesia/komikucom/src/KomikuCom.kt
similarity index 58%
rename from multisrc/overrides/wpmangareader/komikucom/src/KomikuCom.kt
rename to multisrc/overrides/mangathemesia/komikucom/src/KomikuCom.kt
index fa066e922..68b8f87d5 100644
--- a/multisrc/overrides/wpmangareader/komikucom/src/KomikuCom.kt
+++ b/multisrc/overrides/mangathemesia/komikucom/src/KomikuCom.kt
@@ -1,7 +1,7 @@
 package eu.kanade.tachiyomi.extension.id.komikucom
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class KomikuCom : WPMangaReader("Komiku.com", "https://komiku.com", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id")))
+class KomikuCom : MangaThemesia("Komiku.com", "https://komiku.com", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id")))
diff --git a/multisrc/overrides/wpmangastream/kumascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kumascans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/kumascans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kumascans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/kumascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kumascans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/kumascans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kumascans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/kumascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kumascans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/kumascans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kumascans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/kumascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kumascans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/kumascans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kumascans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/kumascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kumascans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/kumascans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/kumascans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/kumascans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/kumascans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/kumascans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/kumascans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/kumascans/src/KumaScans.kt b/multisrc/overrides/mangathemesia/kumascans/src/KumaScans.kt
similarity index 78%
rename from multisrc/overrides/wpmangastream/kumascans/src/KumaScans.kt
rename to multisrc/overrides/mangathemesia/kumascans/src/KumaScans.kt
index 985b1a75b..4a0bde580 100644
--- a/multisrc/overrides/wpmangastream/kumascans/src/KumaScans.kt
+++ b/multisrc/overrides/mangathemesia/kumascans/src/KumaScans.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.en.kumascans
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class KumaScans : WPMangaStream("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en") {
+class KumaScans : MangaThemesia("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangareader/legionscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/legionscan/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/legionscan/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/legionscan/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/legionscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/legionscan/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/legionscan/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/legionscan/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/legionscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/legionscan/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/legionscan/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/legionscan/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/legionscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/legionscan/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/legionscan/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/legionscan/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/legionscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/legionscan/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/legionscan/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/legionscan/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/legionscan/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/legionscan/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/legionscan/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/legionscan/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/legionscan/src/LegionScan.kt b/multisrc/overrides/mangathemesia/legionscan/src/LegionScan.kt
similarity index 73%
rename from multisrc/overrides/wpmangareader/legionscan/src/LegionScan.kt
rename to multisrc/overrides/mangathemesia/legionscan/src/LegionScan.kt
index 442383486..8d9560618 100644
--- a/multisrc/overrides/wpmangareader/legionscan/src/LegionScan.kt
+++ b/multisrc/overrides/mangathemesia/legionscan/src/LegionScan.kt
@@ -1,10 +1,10 @@
 package eu.kanade.tachiyomi.extension.es.legionscan
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class LegionScan : WPMangaReader("Legion Scan", "https://legionscans.com", "es", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es"))) {
+class LegionScan : MangaThemesia("Legion Scan", "https://legionscans.com", "es", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es"))) {
 
     override val seriesTypeSelector = ".imptdt:contains(Tipo) :last-child"
     override val seriesStatusSelector = ".tsinfo .imptdt:contains(Estado) i"
diff --git a/multisrc/overrides/wpmangareader/magusmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/magusmanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/magusmanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/magusmanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/magusmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/magusmanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/magusmanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/magusmanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/magusmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/magusmanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/magusmanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/magusmanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/magusmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/magusmanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/magusmanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/magusmanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/magusmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/magusmanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/magusmanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/magusmanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/magusmanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/magusmanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/magusmanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/magusmanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/magusmanga/src/MagusManga.kt b/multisrc/overrides/mangathemesia/magusmanga/src/MagusManga.kt
similarity index 59%
rename from multisrc/overrides/wpmangareader/magusmanga/src/MagusManga.kt
rename to multisrc/overrides/mangathemesia/magusmanga/src/MagusManga.kt
index beb6f9601..2c7f38e54 100644
--- a/multisrc/overrides/wpmangareader/magusmanga/src/MagusManga.kt
+++ b/multisrc/overrides/mangathemesia/magusmanga/src/MagusManga.kt
@@ -1,7 +1,7 @@
 package eu.kanade.tachiyomi.extension.ar.magusmanga
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class MagusManga : WPMangaReader("Magus Manga", "https://magusmanga.com", "ar", dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("ar")))
+class MagusManga : MangaThemesia("Magus Manga", "https://magusmanga.com", "ar", dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("ar")))
diff --git a/multisrc/overrides/wpmangareader/mangakita/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakita/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangakita/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakita/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangakita/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakita/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangakita/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakita/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangakita/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakita/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangakita/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakita/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangakita/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakita/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangakita/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakita/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangakita/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakita/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangakita/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakita/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangakita/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangakita/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangakita/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/mangakita/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/mangakita/src/MangaKita.kt b/multisrc/overrides/mangathemesia/mangakita/src/MangaKita.kt
new file mode 100644
index 000000000..5b26a5b24
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/mangakita/src/MangaKita.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.id.mangakita
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class MangaKita : MangaThemesia("MangaKita", "https://mangakita.net", "id") {
+    override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/wpmangastream/mangakyo/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakyo/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangakyo/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakyo/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangakyo/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakyo/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangakyo/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakyo/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangakyo/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakyo/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangakyo/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakyo/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangakyo/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakyo/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangakyo/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakyo/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangakyo/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangakyo/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangakyo/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangakyo/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangakyo/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangakyo/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangakyo/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/mangakyo/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/mangakyo/src/Mangakyo.kt b/multisrc/overrides/mangathemesia/mangakyo/src/Mangakyo.kt
similarity index 75%
rename from multisrc/overrides/wpmangastream/mangakyo/src/Mangakyo.kt
rename to multisrc/overrides/mangathemesia/mangakyo/src/Mangakyo.kt
index 1c75baf2a..bbb28d792 100644
--- a/multisrc/overrides/wpmangastream/mangakyo/src/Mangakyo.kt
+++ b/multisrc/overrides/mangathemesia/mangakyo/src/Mangakyo.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.id.mangakyo
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class Mangakyo : WPMangaStream("Mangakyo", "https://www.mangakyo.me", "id") {
+class Mangakyo : MangaThemesia("Mangakyo", "https://www.mangakyo.me", "id") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangastream/mangaproz/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaproz/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaproz/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaproz/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaproz/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaproz/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaproz/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaproz/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaproz/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaproz/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaproz/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaproz/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaproz/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaproz/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaproz/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaproz/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaproz/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaproz/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaproz/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaproz/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaproz/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangaproz/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaproz/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/mangaproz/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/mangaproz/src/MangaPro.kt b/multisrc/overrides/mangathemesia/mangaproz/src/MangaPro.kt
similarity index 75%
rename from multisrc/overrides/wpmangastream/mangaproz/src/MangaPro.kt
rename to multisrc/overrides/mangathemesia/mangaproz/src/MangaPro.kt
index c1fb207f0..3995a1b8f 100644
--- a/multisrc/overrides/wpmangastream/mangaproz/src/MangaPro.kt
+++ b/multisrc/overrides/mangathemesia/mangaproz/src/MangaPro.kt
@@ -1,6 +1,6 @@
 package eu.kanade.tachiyomi.extension.ar.mangaproz
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import eu.kanade.tachiyomi.source.model.SChapter
 import eu.kanade.tachiyomi.source.model.SManga
@@ -10,7 +10,7 @@ import org.jsoup.nodes.Document
 import org.jsoup.nodes.Element
 import java.util.concurrent.TimeUnit
 
-class MangaPro : WPMangaStream("Manga Pro", "https://mangaprotm.com", "ar") {
+class MangaPro : MangaThemesia("Manga Pro", "https://mangaprotm.com", "ar") {
     override val id: Long = 964048798769065340
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
@@ -20,7 +20,7 @@ class MangaPro : WPMangaStream("Manga Pro", "https://mangaprotm.com", "ar") {
         .build()
 
     override fun chapterListParse(response: Response): List<SChapter> =
-        super.chapterListParse(response).filter { !it.url.isNullOrEmpty() }
+        super.chapterListParse(response).filter { it.url.isNotEmpty() }
 
     override fun chapterFromElement(element: Element): SChapter {
         val urlElement = element.select(".lchx > a, span.leftoff a, div.eph-num > a").first()
@@ -38,17 +38,14 @@ class MangaPro : WPMangaStream("Manga Pro", "https://mangaprotm.com", "ar") {
         chapter.name = chapter.name.replace("-*free".toRegex(RegexOption.IGNORE_CASE), "")
         chapter.date_upload =
             element.select("span.rightoff, time, span.chapterdate").firstOrNull()?.text()
-                ?.let { parseChapterDate(it) }
-                ?: 0
+                .parseChapterDate()
         return chapter
     }
 
     override fun mangaDetailsParse(document: Document): SManga =
         super.mangaDetailsParse(document).apply {
-            document.select("div.bigcontent, div.animefull, div.main-info").firstOrNull()
-                ?.let { infoElement ->
-                    thumbnail_url =
-                        infoElement.select(mangaDetailsSelectorThumbnail).attr("abs:data-lazy-src")
-                }
+            document.selectFirst(seriesDetailsSelector)?.let { infoElement ->
+                thumbnail_url = infoElement.select(seriesThumbnailSelector).attr("abs:data-lazy-src")
+            }
         }
 }
diff --git a/multisrc/overrides/wpmangastream/mangaraworg/src/MangaRawOrg.kt b/multisrc/overrides/mangathemesia/mangaraworg/src/MangaRawOrg.kt
similarity index 86%
rename from multisrc/overrides/wpmangastream/mangaraworg/src/MangaRawOrg.kt
rename to multisrc/overrides/mangathemesia/mangaraworg/src/MangaRawOrg.kt
index 6d6c0b776..5e7932f57 100644
--- a/multisrc/overrides/wpmangastream/mangaraworg/src/MangaRawOrg.kt
+++ b/multisrc/overrides/mangathemesia/mangaraworg/src/MangaRawOrg.kt
@@ -1,6 +1,6 @@
 package eu.kanade.tachiyomi.extension.ja.mangaraworg
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.network.asObservableSuccess
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
@@ -17,8 +17,7 @@ import org.jsoup.nodes.Element
 import rx.Observable
 import java.util.concurrent.TimeUnit
 
-class MangaRawOrg : WPMangaStream("Manga Raw.org", "https://mangaraw.org", "ja") {
-    // Formerly "Manga Raw" from WPMangaStream
+class MangaRawOrg : MangaThemesia("Manga Raw.org", "https://mangaraw.org", "ja") {
     override val id = 6223520752496636410
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
@@ -28,8 +27,15 @@ class MangaRawOrg : WPMangaStream("Manga Raw.org", "https://mangaraw.org", "ja")
         .build()
 
     override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/search?order=popular&page=$page", headers)
-    override fun popularMangaSelector() = "div.bsx"
-    override fun popularMangaFromElement(element: Element): SManga {
+
+    override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/search?order=update&page=$page", headers)
+
+    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request =
+        GET("$baseUrl/search?s=$query&page=$page")
+
+    override fun searchMangaSelector() = "div.bsx"
+
+    override fun searchMangaFromElement(element: Element): SManga {
         return SManga.create().apply {
             element.select("div.bigor > a").let {
                 setUrlWithoutDomain(it.attr("href"))
@@ -38,13 +44,12 @@ class MangaRawOrg : WPMangaStream("Manga Raw.org", "https://mangaraw.org", "ja")
             thumbnail_url = element.select("img").attr("abs:src")
         }
     }
-    override fun popularMangaNextPageSelector() = "a[rel=next]"
-    override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/search?order=update&page=$page", headers)
-    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request =
-        GET("$baseUrl/search?s=$query&page=$page")
-    override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element)
+
+    override fun searchMangaNextPageSelector() = "a[rel=next]"
+
     override fun mangaDetailsParse(document: Document): SManga = super.mangaDetailsParse(document)
         .apply { description = document.select("div.bottom").firstOrNull()?.ownText() }
+
     override fun fetchPageList(chapter: SChapter): Observable<List<Page>> {
         return client.newCall(pageListRequest(chapter))
             .asObservableSuccess()
@@ -52,11 +57,13 @@ class MangaRawOrg : WPMangaStream("Manga Raw.org", "https://mangaraw.org", "ja")
                 pageListParse(response, baseUrl + chapter.url.removeSuffix("/"))
             }
     }
+
     private fun pageListParse(response: Response, chapterUrl: String): List<Page> {
         return response.asJsoup().select("span.page-link").first().ownText().substringAfterLast(" ").toInt()
             .let { lastNum -> IntRange(1, lastNum) }
             .map { num -> Page(num, "$chapterUrl/$num") }
     }
+
     override fun imageUrlParse(document: Document): String = document.select("a.img-block img").attr("abs:src")
     override fun getFilterList(): FilterList = FilterList()
 }
diff --git a/multisrc/overrides/wpmangareader/mangaschan/src/MangasChan.kt b/multisrc/overrides/mangathemesia/mangaschan/src/MangasChan.kt
similarity index 77%
rename from multisrc/overrides/wpmangareader/mangaschan/src/MangasChan.kt
rename to multisrc/overrides/mangathemesia/mangaschan/src/MangasChan.kt
index 315fb39bc..18206471d 100644
--- a/multisrc/overrides/wpmangareader/mangaschan/src/MangasChan.kt
+++ b/multisrc/overrides/mangathemesia/mangaschan/src/MangasChan.kt
@@ -1,13 +1,13 @@
 package eu.kanade.tachiyomi.extension.pt.mangaschan
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class MangasChan : WPMangaReader(
+class MangasChan : MangaThemesia(
     "Mangás Chan",
     "https://mangaschan.com",
     "pt-BR",
@@ -18,5 +18,5 @@ class MangasChan : WPMangaReader(
         .rateLimit(1, 2, TimeUnit.SECONDS)
         .build()
 
-    override val altName = "Nome alternativo: "
+    override val altNamePrefix = "Nome alternativo: "
 }
diff --git a/multisrc/overrides/wpmangareader/mangasusu/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangasusu/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangasusu/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangasusu/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangasusu/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangasusu/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangasusu/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangasusu/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangasusu/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangasusu/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangasusu/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangasusu/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangasusu/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangasusu/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangasusu/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangasusu/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangasusu/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangasusu/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangasusu/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangasusu/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangasusu/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangasusu/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangasusu/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/mangasusu/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/mangasusu/src/Mangasusu.kt b/multisrc/overrides/mangathemesia/mangasusu/src/Mangasusu.kt
new file mode 100644
index 000000000..9e74d0f07
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/mangasusu/src/Mangasusu.kt
@@ -0,0 +1,5 @@
+package eu.kanade.tachiyomi.extension.id.mangasusu
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class Mangasusu : MangaThemesia("Mangasusu", "https://mangasusu.co.in", "id", "/komik")
diff --git a/multisrc/overrides/wpmangastream/mangaswat/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaswat/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaswat/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaswat/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaswat/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaswat/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaswat/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaswat/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaswat/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaswat/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaswat/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaswat/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaswat/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaswat/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaswat/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaswat/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaswat/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangaswat/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaswat/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangaswat/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangaswat/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangaswat/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangaswat/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/mangaswat/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/mangaswat/src/MangaSwat.kt b/multisrc/overrides/mangathemesia/mangaswat/src/MangaSwat.kt
new file mode 100644
index 000000000..166c192c5
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/mangaswat/src/MangaSwat.kt
@@ -0,0 +1,57 @@
+package eu.kanade.tachiyomi.extension.ar.mangaswat
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.Page
+import okhttp3.Headers
+import okhttp3.Request
+import org.json.JSONObject
+import org.jsoup.nodes.Document
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaSwat : MangaThemesia(
+    "MangaSwat",
+    "https://swatmanga.co",
+    "ar",
+    dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US)
+) {
+
+    override fun headersBuilder(): Headers.Builder = Headers.Builder()
+        .add(
+            "Accept",
+            "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
+        )
+        .add("Accept-language", "en-US,en;q=0.9")
+        .add("Referer", baseUrl)
+
+    override fun imageRequest(page: Page): Request {
+        val newHeaders = headersBuilder()
+            .set("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
+            .set("Referer", baseUrl)
+            .build()
+        return GET(page.imageUrl!!, newHeaders)
+    }
+
+    override val seriesArtistSelector = "span:contains(الناشر) i"
+    override val seriesAuthorSelector = "span:contains(المؤلف) i"
+    override val seriesGenreSelector = "span:contains(التصنيف) a, .mgen a"
+    override val seriesTypeSelector = "span:contains(النوع) a"
+    override val seriesStatusSelector = "span:contains(الحالة)"
+
+    override val pageSelector = "div#readerarea img"
+
+    override fun pageListParse(document: Document): List<Page> {
+        var page: List<Page>? = null
+        val scriptContent = document.selectFirst("script:containsData(ts_reader)").data()
+        val removeHead = scriptContent.replace("ts_reader.run(", "").replace(");", "")
+        val jsonObject = JSONObject(removeHead)
+        val sourcesArray = jsonObject.getJSONArray("sources")
+        val imagesArray = sourcesArray.getJSONObject(0).getJSONArray("images")
+        page = List(imagesArray.length()) { i ->
+            Page(i, "", imagesArray[i].toString())
+        }
+
+        return page
+    }
+}
diff --git a/multisrc/overrides/wpmangastream/mangceh/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangceh/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangceh/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangceh/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangceh/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangceh/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangceh/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangceh/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangceh/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangceh/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangceh/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangceh/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangceh/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangceh/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangceh/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangceh/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangceh/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangceh/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangceh/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangceh/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mangceh/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangceh/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mangceh/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/mangceh/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/mangceh/src/Mareceh.kt b/multisrc/overrides/mangathemesia/mangceh/src/Mareceh.kt
similarity index 78%
rename from multisrc/overrides/wpmangastream/mangceh/src/Mareceh.kt
rename to multisrc/overrides/mangathemesia/mangceh/src/Mareceh.kt
index 73c554d79..891845d19 100644
--- a/multisrc/overrides/wpmangastream/mangceh/src/Mareceh.kt
+++ b/multisrc/overrides/mangathemesia/mangceh/src/Mareceh.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.id.mangceh
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class Mareceh : WPMangaStream("Mareceh", "https://mareceh.com", "id") {
+class Mareceh : MangaThemesia("Mareceh", "https://mareceh.com", "id") {
 
     override val versionId = 2
 
diff --git a/multisrc/overrides/wpmangareader/mangkomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangkomik/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangkomik/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangkomik/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangkomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangkomik/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangkomik/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangkomik/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangkomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangkomik/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangkomik/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangkomik/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangkomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangkomik/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangkomik/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangkomik/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangkomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangkomik/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangkomik/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mangkomik/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/mangkomik/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangkomik/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/mangkomik/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/mangkomik/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/mangkomik/src/MangKomik.kt b/multisrc/overrides/mangathemesia/mangkomik/src/MangKomik.kt
similarity index 85%
rename from multisrc/overrides/wpmangareader/mangkomik/src/MangKomik.kt
rename to multisrc/overrides/mangathemesia/mangkomik/src/MangKomik.kt
index 7de002c06..ad7c38dee 100644
--- a/multisrc/overrides/wpmangareader/mangkomik/src/MangKomik.kt
+++ b/multisrc/overrides/mangathemesia/mangkomik/src/MangKomik.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.id.mangkomik
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.source.model.Page
 import org.jsoup.nodes.Document
 
-class MangKomik : WPMangaReader("MangKomik", "https://mangkomik.com", "id") {
+class MangKomik : MangaThemesia("MangKomik", "https://mangkomik.com", "id") {
     override val hasProjectPage = true
 
     override fun pageListParse(document: Document): List<Page> {
diff --git a/multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhuaraw/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhuaraw/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhuaraw/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/manhuaraw/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhuaraw/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/manhuaraw/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/manhwaindo/CHANGELOG.md b/multisrc/overrides/mangathemesia/manhwaindo/CHANGELOG.md
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhwaindo/CHANGELOG.md
rename to multisrc/overrides/mangathemesia/manhwaindo/CHANGELOG.md
diff --git a/multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhwaindo/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/manhwaindo/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/manhwaindo/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/manhwaindo/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/manhwaindo/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/manhwaindo/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/manhwaindo/src/ManhwaIndo.kt b/multisrc/overrides/mangathemesia/manhwaindo/src/ManhwaIndo.kt
new file mode 100644
index 000000000..53a391e2c
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/manhwaindo/src/ManhwaIndo.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.id.manhwaindo
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import okhttp3.Headers
+import org.jsoup.nodes.Document
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class ManhwaIndo : MangaThemesia(
+    "Manhwa Indo", "https://manhwaindo.id", "id", "/series",
+    SimpleDateFormat("MMMM dd, yyyy", Locale("id"))
+) {
+
+    override fun headersBuilder(): Headers.Builder = Headers.Builder()
+        .add("Referer", baseUrl)
+
+    override fun mangaDetailsParse(document: Document) = super.mangaDetailsParse(document).apply {
+        thumbnail_url = document.select(seriesThumbnailSelector).attr("abs:src")
+    }
+
+    override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/wpmangareader/martialmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/martialmanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/martialmanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/martialmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/martialmanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/martialmanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/martialmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/martialmanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/martialmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/martialmanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/martialmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/martialmanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/martialmanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/martialmanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/martialmanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/martialmanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/masterkomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/masterkomik/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/masterkomik/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/masterkomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/masterkomik/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/masterkomik/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/masterkomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/masterkomik/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/masterkomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/masterkomik/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/masterkomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/masterkomik/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/masterkomik/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/masterkomik/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/masterkomik/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/masterkomik/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/masterkomik/src/MasterKomik.kt b/multisrc/overrides/mangathemesia/masterkomik/src/MasterKomik.kt
similarity index 79%
rename from multisrc/overrides/wpmangastream/masterkomik/src/MasterKomik.kt
rename to multisrc/overrides/mangathemesia/masterkomik/src/MasterKomik.kt
index 98f94a82a..e9082ffb6 100644
--- a/multisrc/overrides/wpmangastream/masterkomik/src/MasterKomik.kt
+++ b/multisrc/overrides/mangathemesia/masterkomik/src/MasterKomik.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.id.masterkomik
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class MasterKomik : WPMangaStream("MasterKomik", "https://masterkomik.com", "id") {
+class MasterKomik : MangaThemesia("MasterKomik", "https://masterkomik.com", "id") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangareader/miauscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miauscan/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/miauscan/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/miauscan/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/miauscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miauscan/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/miauscan/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/miauscan/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/miauscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miauscan/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/miauscan/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/miauscan/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/miauscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miauscan/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/miauscan/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/miauscan/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/miauscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miauscan/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/miauscan/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/miauscan/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/miauscan/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/miauscan/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/miauscan/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/miauscan/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/miauscan/src/MiauScan.kt b/multisrc/overrides/mangathemesia/miauscan/src/MiauScan.kt
similarity index 70%
rename from multisrc/overrides/wpmangareader/miauscan/src/MiauScan.kt
rename to multisrc/overrides/mangathemesia/miauscan/src/MiauScan.kt
index f6f0f3323..466ca04d0 100644
--- a/multisrc/overrides/wpmangareader/miauscan/src/MiauScan.kt
+++ b/multisrc/overrides/mangathemesia/miauscan/src/MiauScan.kt
@@ -1,10 +1,10 @@
 package eu.kanade.tachiyomi.extension.es.miauscan
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class MiauScan : WPMangaReader(
+class MiauScan : MangaThemesia(
     "Miau Scan",
     "https://miauscan.com",
     "es",
diff --git a/multisrc/overrides/wpmangastream/mihentai/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mihentai/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mihentai/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mihentai/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mihentai/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mihentai/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mihentai/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mihentai/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mihentai/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mihentai/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mihentai/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mihentai/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mihentai/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mihentai/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mihentai/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mihentai/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mihentai/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mihentai/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mihentai/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/mihentai/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/mihentai/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mihentai/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/mihentai/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/mihentai/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/mihentai/src/Mihentai.kt b/multisrc/overrides/mangathemesia/mihentai/src/Mihentai.kt
new file mode 100644
index 000000000..e16f1253e
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/mihentai/src/Mihentai.kt
@@ -0,0 +1,74 @@
+package eu.kanade.tachiyomi.extension.all.mihentai
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.Page
+import kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonPrimitive
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import org.jsoup.nodes.Document
+import java.lang.IllegalArgumentException
+
+class Mihentai : MangaThemesia("Mihentai", "https://mihentai.com", "all") {
+    override fun pageListParse(document: Document): List<Page> {
+        val htmlPages = document.select(pageSelector)
+            .filterNot { it.attr("abs:src").isNullOrEmpty() }
+            .mapIndexed { i, img ->
+                val pageUrl = img.attr("abs:src").substringAfter(baseUrl).prependIndent(baseUrl)
+                Page(i, "", pageUrl)
+            }
+            .toMutableList()
+
+        countViews(document)
+
+        if (htmlPages.isNotEmpty()) { return htmlPages }
+
+        val docString = document.toString()
+        val imageListJson = JSON_IMAGE_LIST_REGEX.find(docString)?.destructured?.toList()?.get(0).orEmpty()
+        val imageList = try {
+            json.parseToJsonElement(imageListJson).jsonArray
+        } catch (_: IllegalArgumentException) {
+            emptyList()
+        }
+        val baseResolver = baseUrl.toHttpUrl()
+
+        val scriptPages = imageList.mapIndexed { i, jsonEl ->
+            val imageUrl = jsonEl.jsonPrimitive.content
+            Page(i, "", baseResolver.resolve(imageUrl).toString())
+        }
+
+        return scriptPages
+    }
+
+    private class StatusFilter : SelectFilter(
+        "Status",
+        arrayOf(
+            Pair("All", ""),
+            Pair("Publishing", "publishing"),
+            Pair("Finished", "finished"),
+            Pair("Dropped", "drop")
+        )
+    )
+
+    private class TypeFilter : SelectFilter(
+        "Type",
+        arrayOf(
+            Pair("Default", ""),
+            Pair("Manga", "Manga"),
+            Pair("Manhwa", "Manhwa"),
+            Pair("Manhua", "Manhua"),
+            Pair("Webtoon", "webtoon"),
+            Pair("One-Shot", "One-Shot"),
+            Pair("Doujin", "doujin")
+        )
+    )
+
+    override fun getFilterList(): FilterList = FilterList(
+        listOf(
+            StatusFilter(),
+            TypeFilter(),
+            OrderByFilter(),
+            GenreListFilter(getGenreList())
+        )
+    )
+}
diff --git a/multisrc/overrides/wpmangareader/modescanlator/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/modescanlator/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/modescanlator/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/modescanlator/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/modescanlator/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/modescanlator/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/modescanlator/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/modescanlator/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/modescanlator/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/modescanlator/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/modescanlator/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/modescanlator/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/modescanlator/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/modescanlator/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/modescanlator/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/modescanlator/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/modescanlator/src/ModeScanlator.kt b/multisrc/overrides/mangathemesia/modescanlator/src/ModeScanlator.kt
similarity index 80%
rename from multisrc/overrides/wpmangareader/modescanlator/src/ModeScanlator.kt
rename to multisrc/overrides/mangathemesia/modescanlator/src/ModeScanlator.kt
index b14c19439..56c4215be 100644
--- a/multisrc/overrides/wpmangareader/modescanlator/src/ModeScanlator.kt
+++ b/multisrc/overrides/mangathemesia/modescanlator/src/ModeScanlator.kt
@@ -1,13 +1,13 @@
 package eu.kanade.tachiyomi.extension.pt.modescanlator
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class ModeScanlator : WPMangaReader(
+class ModeScanlator : MangaThemesia(
     "Mode Scanlator",
     "https://modescanlator.com",
     "pt-BR",
@@ -22,5 +22,5 @@ class ModeScanlator : WPMangaReader(
         .rateLimit(1, 2, TimeUnit.SECONDS)
         .build()
 
-    override val altName = "Nome alternativo: "
+    override val altNamePrefix = "Nome alternativo: "
 }
diff --git a/multisrc/overrides/wpmangareader/ngomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ngomik/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ngomik/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ngomik/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ngomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ngomik/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ngomik/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ngomik/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ngomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ngomik/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ngomik/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ngomik/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ngomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ngomik/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ngomik/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ngomik/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ngomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ngomik/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ngomik/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ngomik/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ngomik/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/ngomik/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ngomik/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/ngomik/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/ngomik/src/Ngomik.kt b/multisrc/overrides/mangathemesia/ngomik/src/Ngomik.kt
similarity index 78%
rename from multisrc/overrides/wpmangareader/ngomik/src/Ngomik.kt
rename to multisrc/overrides/mangathemesia/ngomik/src/Ngomik.kt
index 87d911b7d..645f8baca 100644
--- a/multisrc/overrides/wpmangareader/ngomik/src/Ngomik.kt
+++ b/multisrc/overrides/mangathemesia/ngomik/src/Ngomik.kt
@@ -1,9 +1,9 @@
 package eu.kanade.tachiyomi.extension.id.ngomik
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import okhttp3.Headers
 
-class Ngomik : WPMangaReader("Ngomik", "https://ngomik.net", "id", "/all-komik") {
+class Ngomik : MangaThemesia("Ngomik", "https://ngomik.net", "id", "/all-komik") {
     private val userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
 
     override fun headersBuilder(): Headers.Builder = Headers.Builder()
diff --git a/multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/nonstopscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/nonstopscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/nonstopscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/nonstopscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/nonstopscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/nonstopscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/nonstopscans/src/NonStopScans.kt b/multisrc/overrides/mangathemesia/nonstopscans/src/NonStopScans.kt
similarity index 76%
rename from multisrc/overrides/wpmangastream/nonstopscans/src/NonStopScans.kt
rename to multisrc/overrides/mangathemesia/nonstopscans/src/NonStopScans.kt
index 39d43335b..a51427b77 100644
--- a/multisrc/overrides/wpmangastream/nonstopscans/src/NonStopScans.kt
+++ b/multisrc/overrides/mangathemesia/nonstopscans/src/NonStopScans.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.en.nonstopscans
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class NonStopScans : WPMangaStream("Non-Stop Scans", "https://www.nonstopscans.com", "en") {
+class NonStopScans : MangaThemesia("Non-Stop Scans", "https://www.nonstopscans.com", "en") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangastream/noxsubs/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noxsubs/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/noxsubs/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noxsubs/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/noxsubs/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noxsubs/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/noxsubs/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noxsubs/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/noxsubs/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noxsubs/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/noxsubs/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noxsubs/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/noxsubs/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noxsubs/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/noxsubs/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noxsubs/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/noxsubs/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noxsubs/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/noxsubs/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noxsubs/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/noxsubs/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/noxsubs/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/noxsubs/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/noxsubs/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/noxsubs/src/NoxSubs.kt b/multisrc/overrides/mangathemesia/noxsubs/src/NoxSubs.kt
new file mode 100644
index 000000000..184128c0c
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/noxsubs/src/NoxSubs.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.tr.noxsubs
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class NoxSubs : MangaThemesia("NoxSubs", "https://noxsubs.com", "tr", dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("tr")))
diff --git a/multisrc/overrides/wpmangastream/omegascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/omegascans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/omegascans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/omegascans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/omegascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/omegascans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/omegascans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/omegascans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/omegascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/omegascans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/omegascans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/omegascans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/omegascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/omegascans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/omegascans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/omegascans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/omegascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/omegascans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/omegascans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/omegascans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/omegascans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/omegascans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/omegascans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/omegascans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/origamiorpheans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/origamiorpheans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/origamiorpheans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/origamiorpheans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/origamiorpheans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/origamiorpheans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/origamiorpheans/src/OrigamiOrpheans.kt b/multisrc/overrides/mangathemesia/origamiorpheans/src/OrigamiOrpheans.kt
similarity index 79%
rename from multisrc/overrides/wpmangareader/origamiorpheans/src/OrigamiOrpheans.kt
rename to multisrc/overrides/mangathemesia/origamiorpheans/src/OrigamiOrpheans.kt
index 265603789..039c4f207 100644
--- a/multisrc/overrides/wpmangareader/origamiorpheans/src/OrigamiOrpheans.kt
+++ b/multisrc/overrides/mangathemesia/origamiorpheans/src/OrigamiOrpheans.kt
@@ -1,13 +1,13 @@
 package eu.kanade.tachiyomi.extension.pt.origamiorpheans
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class OrigamiOrpheans : WPMangaReader(
+class OrigamiOrpheans : MangaThemesia(
     "Origami Orpheans",
     "https://origami-orpheans.com.br",
     "pt-BR",
@@ -21,5 +21,5 @@ class OrigamiOrpheans : WPMangaReader(
         .rateLimit(1, 2, TimeUnit.SECONDS)
         .build()
 
-    override val altName = "Nomes alternativos: "
+    override val altNamePrefix = "Nomes alternativos: "
 }
diff --git a/multisrc/overrides/wpmangareader/ozulscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ozulscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ozulscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ozulscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ozulscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ozulscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ozulscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ozulscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ozulscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ozulscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ozulscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ozulscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ozulscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ozulscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ozulscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ozulscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ozulscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ozulscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/ozulscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/ozulscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/ozulscans/src/OzulScans.kt b/multisrc/overrides/mangathemesia/ozulscans/src/OzulScans.kt
similarity index 70%
rename from multisrc/overrides/wpmangareader/ozulscans/src/OzulScans.kt
rename to multisrc/overrides/mangathemesia/ozulscans/src/OzulScans.kt
index 3c947b19d..7c3d8b75d 100644
--- a/multisrc/overrides/wpmangareader/ozulscans/src/OzulScans.kt
+++ b/multisrc/overrides/mangathemesia/ozulscans/src/OzulScans.kt
@@ -1,10 +1,10 @@
 package eu.kanade.tachiyomi.extension.ar.ozulscans
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class OzulScans : WPMangaReader(
+class OzulScans : MangaThemesia(
     "Ozul Scans",
     "https://ozulscans.com",
     "ar",
diff --git a/multisrc/overrides/wpmangareader/patatescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/patatescans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/patatescans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/patatescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/patatescans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/patatescans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/patatescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/patatescans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/patatescans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/patatescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/patatescans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/patatescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/patatescans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/patatescans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/patatescans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/patatescans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/patatescans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/patatescans/src/Patatescans.kt b/multisrc/overrides/mangathemesia/patatescans/src/Patatescans.kt
new file mode 100644
index 000000000..8f96ffc4c
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/patatescans/src/Patatescans.kt
@@ -0,0 +1,5 @@
+package eu.kanade.tachiyomi.extension.fr.patatescans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class Patatescans : MangaThemesia("Patatescans", "https://patatescans.com", "fr")
diff --git a/multisrc/overrides/wpmangastream/phantomscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phantomscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phantomscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phantomscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phantomscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phantomscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phantomscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phantomscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phantomscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phantomscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phantomscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phantomscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phantomscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phantomscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phantomscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phantomscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phantomscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phantomscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phantomscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phantomscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phantomscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/phantomscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phantomscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/phantomscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phoenixfansub/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/phoenixfansub/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/phoenixfansub/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/phoenixfansub/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/phoenixfansub/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/phoenixfansub/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/phoenixfansub/src/PhoenixFansub.kt b/multisrc/overrides/mangathemesia/phoenixfansub/src/PhoenixFansub.kt
new file mode 100644
index 000000000..5b2fdbf33
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/phoenixfansub/src/PhoenixFansub.kt
@@ -0,0 +1,15 @@
+package eu.kanade.tachiyomi.extension.es.phoenixfansub
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class PhoenixFansub : MangaThemesia(
+    "Phoenix Fansub",
+    "https://phoenixfansub.com",
+    "es",
+    dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("es"))
+) {
+
+    override val altNamePrefix: String = "Nombre alternativo: "
+}
diff --git a/multisrc/overrides/wpmangareader/pmscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/pmscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/pmscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/pmscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/pmscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/pmscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/pmscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/pmscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/pmscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/pmscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/pmscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/pmscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/pmscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/pmscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/pmscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/pmscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/pmscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/pmscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/pmscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/pmscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/pmscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/pmscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/pmscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/pmscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/randomscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/randomscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/randomscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/randomscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/randomscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/randomscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/randomscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/randomscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/randomscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/randomscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/randomscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/randomscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/randomscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/randomscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/randomscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/randomscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/randomscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/randomscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/randomscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/randomscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/randomscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/randomscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/randomscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/randomscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/rawkuma/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/rawkuma/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/rawkuma/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/rawkuma/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/rawkuma/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/rawkuma/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/rawkuma/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/rawkuma/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/rawkuma/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/rawkuma/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/rawkuma/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/rawkuma/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/rawkuma/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/rawkuma/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/rawkuma/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/rawkuma/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/rawkuma/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/rawkuma/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/rawkuma/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/rawkuma/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/rawkuma/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/rawkuma/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/rawkuma/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/rawkuma/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/rawkuma/src/Rawkuma.kt b/multisrc/overrides/mangathemesia/rawkuma/src/Rawkuma.kt
similarity index 75%
rename from multisrc/overrides/wpmangastream/rawkuma/src/Rawkuma.kt
rename to multisrc/overrides/mangathemesia/rawkuma/src/Rawkuma.kt
index 25d4b8f73..bce788723 100644
--- a/multisrc/overrides/wpmangastream/rawkuma/src/Rawkuma.kt
+++ b/multisrc/overrides/mangathemesia/rawkuma/src/Rawkuma.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.ja.rawkuma
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class Rawkuma : WPMangaStream("Rawkuma", "https://rawkuma.com/", "ja") {
+class Rawkuma : MangaThemesia("Rawkuma", "https://rawkuma.com/", "ja") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangastream/readkomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/readkomik/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/readkomik/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/readkomik/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/readkomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/readkomik/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/readkomik/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/readkomik/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/readkomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/readkomik/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/readkomik/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/readkomik/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/readkomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/readkomik/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/readkomik/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/readkomik/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/readkomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/readkomik/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/readkomik/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/readkomik/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/readkomik/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/readkomik/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/readkomik/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/readkomik/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/readkomik/src/ReadKomik.kt b/multisrc/overrides/mangathemesia/readkomik/src/ReadKomik.kt
similarity index 77%
rename from multisrc/overrides/wpmangastream/readkomik/src/ReadKomik.kt
rename to multisrc/overrides/mangathemesia/readkomik/src/ReadKomik.kt
index c7a2b6963..98a881a7f 100644
--- a/multisrc/overrides/wpmangastream/readkomik/src/ReadKomik.kt
+++ b/multisrc/overrides/mangathemesia/readkomik/src/ReadKomik.kt
@@ -1,11 +1,11 @@
 package eu.kanade.tachiyomi.extension.en.readkomik
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.util.concurrent.TimeUnit
 
-class ReadKomik : WPMangaStream("Readkomik", "https://readkomik.com", "en") {
+class ReadKomik : MangaThemesia("Readkomik", "https://readkomik.com", "en") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangareader/realmscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/realmscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/realmscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/realmscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/realmscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/realmscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/realmscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/realmscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/realmscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/realmscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/realmscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/realmscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/realmscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/realmscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/realmscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/realmscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/realmscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/realmscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/realmscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/realmscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/realmscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/realmscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/realmscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/realmscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/realmscans/src/RealmScans.kt b/multisrc/overrides/mangathemesia/realmscans/src/RealmScans.kt
similarity index 59%
rename from multisrc/overrides/wpmangareader/realmscans/src/RealmScans.kt
rename to multisrc/overrides/mangathemesia/realmscans/src/RealmScans.kt
index 63c0b9d78..db08abf09 100644
--- a/multisrc/overrides/wpmangareader/realmscans/src/RealmScans.kt
+++ b/multisrc/overrides/mangathemesia/realmscans/src/RealmScans.kt
@@ -1,15 +1,16 @@
 package eu.kanade.tachiyomi.extension.en.realmscans
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import eu.kanade.tachiyomi.source.model.Page
 import kotlinx.serialization.json.jsonArray
 import kotlinx.serialization.json.jsonPrimitive
 import okhttp3.OkHttpClient
 import org.jsoup.nodes.Document
+import java.lang.IllegalArgumentException
 import java.util.concurrent.TimeUnit
 
-class RealmScans : WPMangaReader(
+class RealmScans : MangaThemesia(
     "Realm Scans",
     "https://realmscans.com",
     "en",
@@ -21,31 +22,30 @@ class RealmScans : WPMangaReader(
         .build()
 
     override fun pageListParse(document: Document): List<Page> {
-        val pages = document.select(pageSelector)
+        val htmlPages = document.select(pageSelector)
             .mapIndexed { i, img ->
                 val url = img.attr("data-wpfc-original-src")
                     .ifEmpty { img.attr("abs:src") }
 
                 Page(i, "", url)
             }
-            .toMutableList()
 
         countViews(document)
 
-        if (pages.isNotEmpty()) {
-            return pages
-        }
+        // Some sites also loads pages via javascript
+        if (htmlPages.isNotEmpty()) { return htmlPages }
 
         val docString = document.toString()
-        val imageListRegex = "\\\"images.*?:.*?(\\[.*?\\])".toRegex()
-        val imageListJson = imageListRegex.find(docString)!!.destructured.toList()[0]
-
-        val imageList = json.parseToJsonElement(imageListJson).jsonArray
-
-        pages += imageList.mapIndexed { i, jsonEl ->
+        val imageListJson = JSON_IMAGE_LIST_REGEX.find(docString)?.destructured?.toList()?.get(0).orEmpty()
+        val imageList = try {
+            json.parseToJsonElement(imageListJson).jsonArray
+        } catch (_: IllegalArgumentException) {
+            emptyList()
+        }
+        val scriptPages = imageList.mapIndexed { i, jsonEl ->
             Page(i, "", jsonEl.jsonPrimitive.content)
         }
 
-        return pages
+        return scriptPages
     }
 }
diff --git a/multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sekaikomik/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sekaikomik/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sekaikomik/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/sekaikomik/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sekaikomik/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/sekaikomik/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/sekaikomik/src/Sekaikomik.kt b/multisrc/overrides/mangathemesia/sekaikomik/src/Sekaikomik.kt
similarity index 60%
rename from multisrc/overrides/wpmangareader/sekaikomik/src/Sekaikomik.kt
rename to multisrc/overrides/mangathemesia/sekaikomik/src/Sekaikomik.kt
index 683d84dd0..b07a83af1 100644
--- a/multisrc/overrides/wpmangareader/sekaikomik/src/Sekaikomik.kt
+++ b/multisrc/overrides/mangathemesia/sekaikomik/src/Sekaikomik.kt
@@ -1,7 +1,7 @@
 package eu.kanade.tachiyomi.extension.id.sekaikomik
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class Sekaikomik : WPMangaReader("Sekaikomik", "https://www.sekaikomik.live", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id")))
+class Sekaikomik : MangaThemesia("Sekaikomik", "https://www.sekaikomik.live", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id")))
diff --git a/multisrc/overrides/wpmangastream/sektedoujin/src/SekteDoujin.kt b/multisrc/overrides/mangathemesia/sektedoujin/src/SekteDoujin.kt
similarity index 66%
rename from multisrc/overrides/wpmangastream/sektedoujin/src/SekteDoujin.kt
rename to multisrc/overrides/mangathemesia/sektedoujin/src/SekteDoujin.kt
index f7d36b154..4d7af6f7e 100644
--- a/multisrc/overrides/wpmangastream/sektedoujin/src/SekteDoujin.kt
+++ b/multisrc/overrides/mangathemesia/sektedoujin/src/SekteDoujin.kt
@@ -1,13 +1,13 @@
 package eu.kanade.tachiyomi.extension.id.sektedoujin
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class SekteDoujin : WPMangaStream("Sekte Doujin", "https://sektedoujin.club", "id", SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("id"))) {
+class SekteDoujin : MangaThemesia("Sekte Doujin", "https://sektedoujin.club", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("id"))) {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
diff --git a/multisrc/overrides/wpmangastream/sektekomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sektekomik/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sektekomik/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sektekomik/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sektekomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sektekomik/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sektekomik/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sektekomik/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sektekomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sektekomik/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sektekomik/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sektekomik/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sektekomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sektekomik/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sektekomik/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sektekomik/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sektekomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sektekomik/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sektekomik/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sektekomik/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sektekomik/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/sektekomik/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sektekomik/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/sektekomik/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/sektekomik/src/SekteKomik.kt b/multisrc/overrides/mangathemesia/sektekomik/src/SekteKomik.kt
similarity index 86%
rename from multisrc/overrides/wpmangastream/sektekomik/src/SekteKomik.kt
rename to multisrc/overrides/mangathemesia/sektekomik/src/SekteKomik.kt
index 26e325a8e..885d79ab7 100644
--- a/multisrc/overrides/wpmangastream/sektekomik/src/SekteKomik.kt
+++ b/multisrc/overrides/mangathemesia/sektekomik/src/SekteKomik.kt
@@ -1,6 +1,6 @@
 package eu.kanade.tachiyomi.extension.id.sektekomik
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import eu.kanade.tachiyomi.source.model.Page
@@ -11,7 +11,7 @@ import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class SekteKomik : WPMangaStream("Sekte Komik", "https://sektekomik.com", "id", SimpleDateFormat("MMMM dd, yyyy", Locale("id"))) {
+class SekteKomik : MangaThemesia("Sekte Komik", "https://sektekomik.com", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id"))) {
     // Formerly "Sekte Komik (WP Manga Stream)"
     override val id = 7866629035053218469
 
diff --git a/multisrc/overrides/wpmangastream/sheamanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sheamanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sheamanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sheamanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sheamanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sheamanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sheamanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sheamanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sheamanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sheamanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sheamanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sheamanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sheamanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sheamanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sheamanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sheamanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sheamanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sheamanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sheamanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sheamanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/sheamanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/sheamanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/sheamanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/sheamanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/sheamanga/src/SheaManga.kt b/multisrc/overrides/mangathemesia/sheamanga/src/SheaManga.kt
similarity index 87%
rename from multisrc/overrides/wpmangastream/sheamanga/src/SheaManga.kt
rename to multisrc/overrides/mangathemesia/sheamanga/src/SheaManga.kt
index d935a39a8..341f6cff7 100644
--- a/multisrc/overrides/wpmangastream/sheamanga/src/SheaManga.kt
+++ b/multisrc/overrides/mangathemesia/sheamanga/src/SheaManga.kt
@@ -1,6 +1,6 @@
 package eu.kanade.tachiyomi.extension.id.sheamanga
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.Dns
 import okhttp3.OkHttpClient
@@ -8,7 +8,7 @@ import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class SheaManga : WPMangaStream(
+class SheaManga : MangaThemesia(
     "Shea Manga",
     "https://sheakomik.com",
     "id",
diff --git a/multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/shootingstarscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/shootingstarscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/shootingstarscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/shootingstarscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/shootingstarscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/shootingstarscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/silencescan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/silencescan/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/silencescan/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/silencescan/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/silencescan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/silencescan/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/silencescan/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/silencescan/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/silencescan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/silencescan/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/silencescan/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/silencescan/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/silencescan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/silencescan/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/silencescan/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/silencescan/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/silencescan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/silencescan/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/silencescan/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/silencescan/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/silencescan/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/silencescan/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/silencescan/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/silencescan/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/silencescan/src/SilenceScan.kt b/multisrc/overrides/mangathemesia/silencescan/src/SilenceScan.kt
similarity index 67%
rename from multisrc/overrides/wpmangareader/silencescan/src/SilenceScan.kt
rename to multisrc/overrides/mangathemesia/silencescan/src/SilenceScan.kt
index d4442ab6d..37f3f80c4 100644
--- a/multisrc/overrides/wpmangareader/silencescan/src/SilenceScan.kt
+++ b/multisrc/overrides/mangathemesia/silencescan/src/SilenceScan.kt
@@ -1,6 +1,6 @@
 package eu.kanade.tachiyomi.extension.pt.silencescan
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import eu.kanade.tachiyomi.source.model.SManga
 import okhttp3.OkHttpClient
@@ -8,7 +8,7 @@ import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class SilenceScan : WPMangaReader(
+class SilenceScan : MangaThemesia(
     "Silence Scan",
     "https://silencescan.com.br",
     "pt-BR",
@@ -23,11 +23,12 @@ class SilenceScan : WPMangaReader(
         .rateLimit(1, 2, TimeUnit.SECONDS)
         .build()
 
-    override val altName = "Nome alternativo: "
+    override val altNamePrefix = "Nome alternativo: "
 
-    override fun parseStatus(status: String) = when {
-        status.contains("Em Andamento") -> SManga.ONGOING
-        status.contains("Completo") -> SManga.COMPLETED
+    override fun String?.parseStatus() = when {
+        this == null -> SManga.UNKNOWN
+        this.contains("Em Andamento") -> SManga.ONGOING
+        this.contains("Completo") -> SManga.COMPLETED
         else -> SManga.UNKNOWN
     }
 }
diff --git a/multisrc/overrides/wpmangareader/skullscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skullscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/skullscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/skullscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/skullscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skullscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/skullscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/skullscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/skullscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skullscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/skullscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/skullscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/skullscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skullscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/skullscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/skullscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/skullscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skullscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/skullscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/skullscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/skullscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/skullscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/skullscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/skullscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/summerfansub/src/SummerFansub.kt b/multisrc/overrides/mangathemesia/summerfansub/src/SummerFansub.kt
similarity index 83%
rename from multisrc/overrides/wpmangastream/summerfansub/src/SummerFansub.kt
rename to multisrc/overrides/mangathemesia/summerfansub/src/SummerFansub.kt
index 169344c87..ee9375c8f 100644
--- a/multisrc/overrides/wpmangastream/summerfansub/src/SummerFansub.kt
+++ b/multisrc/overrides/mangathemesia/summerfansub/src/SummerFansub.kt
@@ -1,13 +1,13 @@
 package eu.kanade.tachiyomi.extension.pt.summerfansub
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class SummerFansub : WPMangaStream(
+class SummerFansub : MangaThemesia(
     "Summer Fansub",
     "https://smmr.in",
     "pt-BR",
diff --git a/multisrc/overrides/wpmangareader/sushiscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscan/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sushiscan/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sushiscan/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sushiscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscan/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sushiscan/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sushiscan/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sushiscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscan/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sushiscan/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sushiscan/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sushiscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscan/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sushiscan/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sushiscan/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sushiscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscan/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sushiscan/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/sushiscan/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/sushiscan/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/sushiscan/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/sushiscan/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/sushiscan/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/sushiscan/src/SushiScan.kt b/multisrc/overrides/mangathemesia/sushiscan/src/SushiScan.kt
similarity index 50%
rename from multisrc/overrides/wpmangareader/sushiscan/src/SushiScan.kt
rename to multisrc/overrides/mangathemesia/sushiscan/src/SushiScan.kt
index 0207ad436..3dfc0d873 100644
--- a/multisrc/overrides/wpmangareader/sushiscan/src/SushiScan.kt
+++ b/multisrc/overrides/mangathemesia/sushiscan/src/SushiScan.kt
@@ -1,18 +1,19 @@
 package eu.kanade.tachiyomi.extension.fr.sushiscan
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.source.model.SManga
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class SushiScan : WPMangaReader("Sushi-Scan", "https://sushiscan.su", "fr", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.FRENCH)) {
-    override val altName = "Nom alternatif : "
+class SushiScan : MangaThemesia("Sushi-Scan", "https://sushiscan.su", "fr", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.FRENCH)) {
+    override val altNamePrefix = "Nom alternatif : "
     override val seriesStatusSelector = ".tsinfo .imptdt:contains(Statut)"
     override val seriesArtistSelector = ".tsinfo .imptdt:contains(Dessinateur) i"
 
-    override fun parseStatus(status: String) = when {
-        status.contains("En Cours") -> SManga.ONGOING
-        status.contains("Terminé") -> SManga.COMPLETED
+    override fun String?.parseStatus(): Int = when {
+        this == null -> SManga.UNKNOWN
+        this.contains("En Cours", ignoreCase = true) -> SManga.ONGOING
+        this.contains("Terminé", ignoreCase = true) -> SManga.COMPLETED
         else -> SManga.UNKNOWN
     }
 }
diff --git a/multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/tempestmanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tempestmanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/tempestmanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/tempestmanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/tempestmanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/tempestmanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/tempestmanga/src/TempestManga.kt b/multisrc/overrides/mangathemesia/tempestmanga/src/TempestManga.kt
similarity index 75%
rename from multisrc/overrides/wpmangastream/tempestmanga/src/TempestManga.kt
rename to multisrc/overrides/mangathemesia/tempestmanga/src/TempestManga.kt
index 3c79e3398..1402f3bfa 100644
--- a/multisrc/overrides/wpmangastream/tempestmanga/src/TempestManga.kt
+++ b/multisrc/overrides/mangathemesia/tempestmanga/src/TempestManga.kt
@@ -1,15 +1,15 @@
 package eu.kanade.tachiyomi.extension.tr.tempestmanga
 
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class TempestManga : WPMangaStream(
+class TempestManga : MangaThemesia(
     "Tempest Manga", "https://manga.tempestfansub.com", "tr",
-    SimpleDateFormat("MMMM dd, yyyy", Locale("tr"))
+    dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("tr"))
 ) {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
diff --git a/multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/theapolloteam/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/theapolloteam/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/theapolloteam/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/theapolloteam/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/theapolloteam/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/theapolloteam/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/tsundokutraducoes/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tsundokutraducoes/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/tsundokutraducoes/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/tsundokutraducoes/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/tsundokutraducoes/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/tsundokutraducoes/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/tsundokutraducoes/src/TsundokuTraducoes.kt b/multisrc/overrides/mangathemesia/tsundokutraducoes/src/TsundokuTraducoes.kt
similarity index 81%
rename from multisrc/overrides/wpmangareader/tsundokutraducoes/src/TsundokuTraducoes.kt
rename to multisrc/overrides/mangathemesia/tsundokutraducoes/src/TsundokuTraducoes.kt
index 260486674..01f514367 100644
--- a/multisrc/overrides/wpmangareader/tsundokutraducoes/src/TsundokuTraducoes.kt
+++ b/multisrc/overrides/mangathemesia/tsundokutraducoes/src/TsundokuTraducoes.kt
@@ -1,13 +1,13 @@
 package eu.kanade.tachiyomi.extension.pt.tsundokutraducoes
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import okhttp3.OkHttpClient
 import java.text.SimpleDateFormat
 import java.util.Locale
 import java.util.concurrent.TimeUnit
 
-class TsundokuTraducoes : WPMangaReader(
+class TsundokuTraducoes : MangaThemesia(
     "Tsundoku Traduções",
     "https://tsundoku.com.br",
     "pt-BR",
@@ -18,7 +18,7 @@ class TsundokuTraducoes : WPMangaReader(
         .rateLimit(1, 2, TimeUnit.SECONDS)
         .build()
 
-    override val altName = "Nome alternativo: "
+    override val altNamePrefix = "Nome alternativo: "
 
     override fun searchMangaSelector() = ".utao .uta .imgu, .listupd .bs .bsx:not(:has(span.novelabel)), .listo .bs .bsx:not(:has(span.novelabel))"
 }
diff --git a/multisrc/overrides/wpmangareader/turktoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/turktoon/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/turktoon/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/turktoon/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/turktoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/turktoon/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/turktoon/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/turktoon/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/turktoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/turktoon/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/turktoon/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/turktoon/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/turktoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/turktoon/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/turktoon/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/turktoon/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/turktoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/turktoon/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/turktoon/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/turktoon/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/turktoon/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/turktoon/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/turktoon/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/turktoon/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/turktoon/src/TurkToon.kt b/multisrc/overrides/mangathemesia/turktoon/src/TurkToon.kt
similarity index 69%
rename from multisrc/overrides/wpmangareader/turktoon/src/TurkToon.kt
rename to multisrc/overrides/mangathemesia/turktoon/src/TurkToon.kt
index 7ed32f486..625cee0a7 100644
--- a/multisrc/overrides/wpmangareader/turktoon/src/TurkToon.kt
+++ b/multisrc/overrides/mangathemesia/turktoon/src/TurkToon.kt
@@ -1,10 +1,10 @@
 package eu.kanade.tachiyomi.extension.tr.turktoon
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class TurkToon : WPMangaReader(
+class TurkToon : MangaThemesia(
     "TurkToon", "https://turktoon.com", "tr",
     dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("tr"))
 )
diff --git a/multisrc/overrides/wpmangastream/westmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/westmanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/westmanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/westmanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/westmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/westmanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/westmanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/westmanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/westmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/westmanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/westmanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/westmanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/westmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/westmanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/westmanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/westmanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/westmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/westmanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/westmanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/westmanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/westmanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/westmanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/westmanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/westmanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/westmanga/src/WestManga.kt b/multisrc/overrides/mangathemesia/westmanga/src/WestManga.kt
new file mode 100644
index 000000000..2d460ba15
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/westmanga/src/WestManga.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.id.westmanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.util.concurrent.TimeUnit
+
+class WestManga : MangaThemesia("West Manga", "https://westmanga.info", "id") {
+    // Formerly "West Manga (WP Manga Stream)"
+    override val id = 8883916630998758688
+
+    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+        .connectTimeout(10, TimeUnit.SECONDS)
+        .readTimeout(30, TimeUnit.SECONDS)
+        .rateLimit(4)
+        .build()
+
+    override val seriesDetailsSelector = ".seriestucontent"
+    override val seriesTypeSelector = ".infotable tr:contains(Type) td:last-child"
+
+    override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/whitecloudpavilionnew/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/whitecloudpavilionnew/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/whitecloudpavilionnew/src/WhiteCloudPavilion.kt b/multisrc/overrides/mangathemesia/whitecloudpavilionnew/src/WhiteCloudPavilion.kt
similarity index 64%
rename from multisrc/overrides/wpmangareader/whitecloudpavilionnew/src/WhiteCloudPavilion.kt
rename to multisrc/overrides/mangathemesia/whitecloudpavilionnew/src/WhiteCloudPavilion.kt
index 26694c638..47b868ace 100644
--- a/multisrc/overrides/wpmangareader/whitecloudpavilionnew/src/WhiteCloudPavilion.kt
+++ b/multisrc/overrides/mangathemesia/whitecloudpavilionnew/src/WhiteCloudPavilion.kt
@@ -1,8 +1,8 @@
 package eu.kanade.tachiyomi.extension.en.whitecloudpavilionnew
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 
-class WhiteCloudPavilion : WPMangaReader(
+class WhiteCloudPavilion : MangaThemesia(
     "White Cloud Pavilion (New)",
     "https://www.whitecloudpavilion.com",
     lang = "en",
diff --git a/multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/worldromancetranslation/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/worldromancetranslation/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangareader/worldromancetranslation/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/worldromancetranslation/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangareader/worldromancetranslation/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/worldromancetranslation/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangareader/worldromancetranslation/src/WorldRomanceTranslation.kt b/multisrc/overrides/mangathemesia/worldromancetranslation/src/WorldRomanceTranslation.kt
similarity index 90%
rename from multisrc/overrides/wpmangareader/worldromancetranslation/src/WorldRomanceTranslation.kt
rename to multisrc/overrides/mangathemesia/worldromancetranslation/src/WorldRomanceTranslation.kt
index c01075e42..8bfdd991d 100644
--- a/multisrc/overrides/wpmangareader/worldromancetranslation/src/WorldRomanceTranslation.kt
+++ b/multisrc/overrides/mangathemesia/worldromancetranslation/src/WorldRomanceTranslation.kt
@@ -1,13 +1,13 @@
 package eu.kanade.tachiyomi.extension.id.worldromancetranslation
 
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.source.model.SManga
 import okhttp3.Headers
 import org.jsoup.nodes.Document
 import java.text.SimpleDateFormat
 import java.util.Locale
 
-class WorldRomanceTranslation : WPMangaReader(
+class WorldRomanceTranslation : MangaThemesia(
     "World Romance Translation",
     "https://wrt.my.id",
     "id",
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/xcalibrscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/xcalibrscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/xcalibrscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/wpmangastream/xcalibrscans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/xcalibrscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/src/interceptor/MirrorImageInterceptor.kt b/multisrc/overrides/mangathemesia/xcalibrscans/src/interceptor/MirrorImageInterceptor.kt
similarity index 100%
rename from multisrc/overrides/wpmangastream/xcalibrscans/src/interceptor/MirrorImageInterceptor.kt
rename to multisrc/overrides/mangathemesia/xcalibrscans/src/interceptor/MirrorImageInterceptor.kt
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/src/interceptor/SplittedImageInterceptor.kt b/multisrc/overrides/mangathemesia/xcalibrscans/src/interceptor/SplittedImageInterceptor.kt
similarity index 100%
rename from multisrc/overrides/wpmangastream/xcalibrscans/src/interceptor/SplittedImageInterceptor.kt
rename to multisrc/overrides/mangathemesia/xcalibrscans/src/interceptor/SplittedImageInterceptor.kt
diff --git a/multisrc/overrides/wpmangastream/xcalibrscans/src/xCaliBRScans.kt b/multisrc/overrides/mangathemesia/xcalibrscans/src/xCaliBRScans.kt
similarity index 78%
rename from multisrc/overrides/wpmangastream/xcalibrscans/src/xCaliBRScans.kt
rename to multisrc/overrides/mangathemesia/xcalibrscans/src/xCaliBRScans.kt
index 0552ae929..3e9e2f508 100644
--- a/multisrc/overrides/wpmangastream/xcalibrscans/src/xCaliBRScans.kt
+++ b/multisrc/overrides/mangathemesia/xcalibrscans/src/xCaliBRScans.kt
@@ -4,20 +4,17 @@ import eu.kanade.tachiyomi.extension.en.xcalibrscans.interceptor.MirrorImageInte
 import eu.kanade.tachiyomi.extension.en.xcalibrscans.interceptor.SplittedImageInterceptor
 import eu.kanade.tachiyomi.extension.en.xcalibrscans.interceptor.prepareMirrorImageForInterceptor
 import eu.kanade.tachiyomi.extension.en.xcalibrscans.interceptor.prepareSplittedImageForInterceptor
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
 import eu.kanade.tachiyomi.network.interceptor.rateLimit
 import eu.kanade.tachiyomi.source.model.Page
-import kotlinx.serialization.json.Json
 import kotlinx.serialization.json.jsonArray
 import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.HttpUrl.Companion.toHttpUrl
 import okhttp3.OkHttpClient
 import org.jsoup.nodes.Document
-import uy.kohesive.injekt.injectLazy
+import java.lang.IllegalArgumentException
 import java.util.concurrent.TimeUnit
 
-class xCaliBRScans : WPMangaStream("xCaliBR Scans", "https://xcalibrscans.com", "en") {
-    private val json: Json by injectLazy()
+class xCaliBRScans : MangaThemesia("xCaliBR Scans", "https://xcalibrscans.com", "en") {
 
     override val client: OkHttpClient = network.cloudflareClient.newBuilder()
         .connectTimeout(10, TimeUnit.SECONDS)
@@ -69,24 +66,22 @@ class xCaliBRScans : WPMangaStream("xCaliBR Scans", "https://xcalibrscans.com",
                 }
             }
 
-        val docString = document.toString()
-        val imageListRegex = Regex("\\\"images.*?:.*?(\\[.*?\\])")
-        val imageListJson = imageListRegex.find(docString)!!.destructured.toList()[0]
-
-        val imageList = json.parseToJsonElement(imageListJson).jsonArray
-        val baseResolver = baseUrl.toHttpUrl()
-
-        val scriptPages = imageList.mapIndexed { i, jsonEl ->
-            val imageUrl = jsonEl.jsonPrimitive.content
-            Page(i, "", baseResolver.resolve(imageUrl).toString())
-        }
-
-        if (htmlPages.size < scriptPages.size) {
-            htmlPages += scriptPages
-        }
-
         countViews(document)
 
-        return htmlPages.distinctBy { it.imageUrl }
+        // Some sites also loads pages via javascript
+        if (htmlPages.isNotEmpty()) { return htmlPages }
+
+        val docString = document.toString()
+        val imageListJson = JSON_IMAGE_LIST_REGEX.find(docString)?.destructured?.toList()?.get(0).orEmpty()
+        val imageList = try {
+            json.parseToJsonElement(imageListJson).jsonArray
+        } catch (_: IllegalArgumentException) {
+            emptyList()
+        }
+        val scriptPages = imageList.mapIndexed { i, jsonEl ->
+            Page(i, "", jsonEl.jsonPrimitive.content)
+        }
+
+        return scriptPages
     }
 }
diff --git a/multisrc/overrides/wpmangareader/acescans/src/AceScans.kt b/multisrc/overrides/wpmangareader/acescans/src/AceScans.kt
deleted file mode 100644
index 5c1b0e47b..000000000
--- a/multisrc/overrides/wpmangareader/acescans/src/AceScans.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.acescans
-
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
-import eu.kanade.tachiyomi.source.model.Page
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-
-class AceScans : WPMangaReader("Ace Scans", "https://acescans.xyz", "en") {
-    override fun searchMangaFromElement(element: Element) =
-        super.searchMangaFromElement(element).apply {
-            thumbnail_url = element.select("img").attr("abs:data-src")
-        }
-
-    override fun mangaDetailsParse(document: Document) = super.mangaDetailsParse(document).apply {
-        thumbnail_url = document.select(seriesThumbnailSelector).attr("abs:data-src")
-    }
-
-    override fun pageListParse(document: Document): List<Page> =
-        document.select(pageSelector).filterNot {
-            it.attr("abs:data-src").isNullOrEmpty()
-        }.mapIndexed { i, img -> Page(i, "", img.attr("abs:data-src")) }
-}
diff --git a/multisrc/overrides/wpmangareader/default/AndroidManifest.xml b/multisrc/overrides/wpmangareader/default/AndroidManifest.xml
deleted file mode 100644
index 490d1a53d..000000000
--- a/multisrc/overrides/wpmangareader/default/AndroidManifest.xml
+++ /dev/null
@@ -1,33 +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="eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReaderUrlActivity"
-            android:excludeFromRecents="true"
-            android:exported="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" />
-                <data
-                    android:host="${SOURCEHOST}"
-                    android:pathPattern="/.*/..*"
-                    android:scheme="${SOURCESCHEME}" />
-            </intent-filter>
-            <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="${SOURCEHOST}"
-                    android:pathPattern="/..*"
-                    android:scheme="${SOURCESCHEME}" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
\ No newline at end of file
diff --git a/multisrc/overrides/wpmangareader/kiryuu/src/Kiryuu.kt b/multisrc/overrides/wpmangareader/kiryuu/src/Kiryuu.kt
deleted file mode 100644
index 0e0d784fc..000000000
--- a/multisrc/overrides/wpmangareader/kiryuu/src/Kiryuu.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.kiryuu
-
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.OkHttpClient
-import org.jsoup.nodes.Document
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class Kiryuu : WPMangaReader("Kiryuu", "https://kiryuu.id", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id"))) {
-    // Formerly "Kiryuu (WP Manga Stream)"
-    override val id = 3639673976007021338
-
-    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
-        .connectTimeout(10, TimeUnit.SECONDS)
-        .readTimeout(30, TimeUnit.SECONDS)
-        .rateLimit(4)
-        .build()
-
-    // manga details
-    override fun mangaDetailsParse(document: Document) = SManga.create().apply {
-        author = document.select(".listinfo li:contains(Author), .tsinfo .imptdt:nth-child(4) i, .infotable tr:contains(author) td:last-child")
-            .firstOrNull()?.ownText()
-
-        artist = document.select(".infotable tr:contains(artist) td:last-child, .tsinfo .imptdt:contains(artist) i")
-            .firstOrNull()?.ownText()
-
-        genre = document.select("div.gnr a, .mgen a, .seriestugenre a").joinToString { it.text() }
-        status = parseStatus(
-            document.select("div.listinfo li:contains(Status), .tsinfo .imptdt:contains(status), .tsinfo .imptdt:contains(الحالة), .infotable tr:contains(status) td")
-                .text()
-        )
-
-        title = document.selectFirst(".thumb img").attr("title")
-        thumbnail_url = document.select(".thumb img").attr("src")
-        description = document.select(".desc, .entry-content[itemprop=description]").joinToString("\n") { it.text() }
-
-        // add series type(manga/manhwa/manhua/other) thinggy to genre
-        document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-            if (it.isEmpty().not() && genre!!.contains(it, true).not()) {
-                genre += if (genre!!.isEmpty()) it else ", $it"
-            }
-        }
-
-        // add alternative name to manga description
-        document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-            if (it.isEmpty().not()) {
-                description += when {
-                    description!!.isEmpty() -> altName + it
-                    else -> "\n\n$altName" + it
-                }
-            }
-        }
-    }
-
-    override val hasProjectPage = true
-}
diff --git a/multisrc/overrides/wpmangareader/komiklab/src/KomikLab.kt b/multisrc/overrides/wpmangareader/komiklab/src/KomikLab.kt
deleted file mode 100644
index 7e4f523e1..000000000
--- a/multisrc/overrides/wpmangareader/komiklab/src/KomikLab.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.komiklab
-
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
-import eu.kanade.tachiyomi.source.model.SManga
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-
-class KomikLab : WPMangaReader("Komik Lab", "https://komiklab.com", "id") {
-    override val hasProjectPage = true
-
-    override fun mangaDetailsParse(document: Document) = SManga.create().apply {
-        author = document.select(".listinfo li:contains(Author), .tsinfo .imptdt:nth-child(4) i, .infotable tr:contains(author) td:last-child")
-            .firstOrNull()?.ownText()
-
-        artist = document.select(".infotable tr:contains(artist) td:last-child, .tsinfo .imptdt:contains(artist) i")
-            .firstOrNull()?.ownText()
-
-        genre = document.select("div.gnr a, .mgen a, .seriestugenre a").joinToString { it.text() }
-        status = parseStatus(
-            document.select("div.listinfo li:contains(Status), .tsinfo .imptdt:contains(status), .tsinfo .imptdt:contains(الحالة), .infotable tr:contains(status) td")
-                .text()
-        )
-
-        title = document.selectFirst("h1.entry-title").text()
-        thumbnail_url = document.select(".infomanga > div[itemprop=image] img, .thumb img").attr("abs:data-src")
-        description = document.select(".desc, .entry-content[itemprop=description]").joinToString("\n") { it.text() }
-
-        // add series type(manga/manhwa/manhua/other) thinggy to genre
-        document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-            if (it.isEmpty().not() && genre!!.contains(it, true).not()) {
-                genre += if (genre!!.isEmpty()) it else ", $it"
-            }
-        }
-
-        // add alternative name to manga description
-        document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-            if (it.isEmpty().not()) {
-                description += when {
-                    description!!.isEmpty() -> altName + it
-                    else -> "\n\n$altName" + it
-                }
-            }
-        }
-    }
-
-    override fun searchMangaFromElement(element: Element) = SManga.create().apply {
-        thumbnail_url = element.select("img").attr("abs:data-src")
-        title = element.select("a").attr("title")
-        setUrlWithoutDomain(element.select("a").attr("href"))
-    }
-}
diff --git a/multisrc/overrides/wpmangareader/mangakita/src/MangaKita.kt b/multisrc/overrides/wpmangareader/mangakita/src/MangaKita.kt
deleted file mode 100644
index 3224b3921..000000000
--- a/multisrc/overrides/wpmangareader/mangakita/src/MangaKita.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.mangakita
-
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
-
-class MangaKita : WPMangaReader("MangaKita", "https://mangakita.net", "id") {
-    override val hasProjectPage = true
-}
diff --git a/multisrc/overrides/wpmangareader/mangasusu/src/Mangasusu.kt b/multisrc/overrides/wpmangareader/mangasusu/src/Mangasusu.kt
deleted file mode 100644
index c143658b8..000000000
--- a/multisrc/overrides/wpmangareader/mangasusu/src/Mangasusu.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.mangasusu
-
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
-
-class Mangasusu : WPMangaReader("Mangasusu", "https://mangasusu.co.in", "id", "/komik")
diff --git a/multisrc/overrides/wpmangareader/manhwaindo/src/ManhwaIndo.kt b/multisrc/overrides/wpmangareader/manhwaindo/src/ManhwaIndo.kt
deleted file mode 100644
index 17420cdb2..000000000
--- a/multisrc/overrides/wpmangareader/manhwaindo/src/ManhwaIndo.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.manhwaindo
-
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
-import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.Headers
-import org.jsoup.nodes.Document
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class ManhwaIndo : WPMangaReader(
-    "Manhwa Indo", "https://manhwaindo.id", "id", "/series",
-    SimpleDateFormat("MMMM dd, yyyy", Locale("id"))
-) {
-
-    override fun headersBuilder(): Headers.Builder = Headers.Builder()
-        .add("Referer", baseUrl)
-
-    // manga details
-    override fun mangaDetailsParse(document: Document) = SManga.create().apply {
-        author = document.select(seriesAuthorSelector).firstOrNull()?.ownText()
-        artist = document.select(seriesArtistSelector).firstOrNull()?.ownText()
-        genre = document.select(seriesGenreSelector).joinToString { it.text() }
-        status = parseStatus(document.select(seriesStatusSelector).text())
-        thumbnail_url = document.select(seriesThumbnailSelector).attr("abs:src")
-        description = document.select(seriesDescriptionSelector).joinToString("\n") { it.text() }
-
-        // add series type(manga/manhwa/manhua/other) thinggy to genre
-        document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-            if (it.isEmpty().not() && genre!!.contains(it, true).not()) {
-                genre += if (genre!!.isEmpty()) it else ", $it"
-            }
-        }
-
-        // add alternative name to manga description
-        document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-            if (it.isEmpty().not()) {
-                description += when {
-                    description!!.isEmpty() -> altName + it
-                    else -> "\n\n$altName" + it
-                }
-            }
-        }
-    }
-
-    override val hasProjectPage = true
-}
diff --git a/multisrc/overrides/wpmangareader/patatescans/src/Patatescans.kt b/multisrc/overrides/wpmangareader/patatescans/src/Patatescans.kt
deleted file mode 100644
index fb87a7d7b..000000000
--- a/multisrc/overrides/wpmangareader/patatescans/src/Patatescans.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package eu.kanade.tachiyomi.extension.fr.patatescans
-
-import eu.kanade.tachiyomi.multisrc.wpmangareader.WPMangaReader
-
-class Patatescans : WPMangaReader("Patatescans", "https://patatescans.com", "fr")
diff --git a/multisrc/overrides/wpmangastream/asurascans/src/AsuraScansFactory.kt b/multisrc/overrides/wpmangastream/asurascans/src/AsuraScansFactory.kt
deleted file mode 100644
index fd2edd353..000000000
--- a/multisrc/overrides/wpmangastream/asurascans/src/AsuraScansFactory.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.asurascans
-
-import eu.kanade.tachiyomi.source.SourceFactory
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SManga
-import org.jsoup.nodes.Document
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class AsuraScansFactory : SourceFactory {
-    override fun createSources() = listOf(
-        AsuraScansEn(),
-        AsuraScansTr()
-    )
-}
-
-class AsuraScansEn : AsuraScans("https://www.asurascans.com", "en", SimpleDateFormat("MMM d, yyyy", Locale.US)) {
-
-    override val mangaDetailsSelectorDescription = "div.desc p, div.entry-content p, div[itemprop=description]:not(:has(p))"
-
-    override val pageSelector = "div.rdminimal > img, div.rdminimal > p > img, div.rdminimal > a > img, div.rdminimal > p > a > img"
-
-    // Skip scriptPages
-    override fun pageListParse(document: Document): List<Page> {
-        return document.select(pageSelector)
-            .filterNot { it.attr("src").isNullOrEmpty() }
-            .mapIndexed { i, img -> Page(i, "", img.attr("src")) }
-    }
-}
-
-class AsuraScansTr : AsuraScans("https://tr.asurascans.com", "tr", SimpleDateFormat("MMM d, yyyy", Locale("tr"))) {
-    override fun mangaDetailsParse(document: Document): SManga {
-        return SManga.create().apply {
-            document.select("div.bigcontent").firstOrNull()?.let { infoElement ->
-                status = parseStatus(infoElement.select(".imptdt:contains(Durum) i").firstOrNull()?.ownText())
-                infoElement.select(".fmed b:contains(Yazar)+span").firstOrNull()?.ownText().let {
-                    if (it.isNullOrBlank().not() && it != "N/A" && it != "-") {
-                        author = it
-                    }
-                }
-                infoElement.select(".fmed b:contains(Çizer)+span").firstOrNull()?.ownText().let {
-                    if (it.isNullOrBlank().not() && it != "N/A" && it != "-") {
-                        artist = it
-                    }
-                }
-                description = infoElement.select("div.desc p, div.entry-content p").joinToString("\n") { it.text() }
-                thumbnail_url = infoElement.select("div.thumb img").imgAttr()
-
-                val genres = infoElement.select(".mgen a")
-                    .map { element -> element.text().lowercase(Locale.ROOT) }
-                    .toMutableSet()
-
-                // add series type(manga/manhwa/manhua/other) thinggy to genre
-                document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isEmpty().not() && genres.contains(it).not()) {
-                        genres.add(it.lowercase(Locale.ROOT))
-                    }
-                }
-
-                genre = genres.toList().map { it.capitalize(Locale.ROOT) }.joinToString(", ")
-
-                // add alternative name to manga description
-                document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isBlank().not() && it != "N/A" && it != "-") {
-                        description = when {
-                            description.isNullOrBlank() -> altName + it
-                            else -> description + "\n\n$altName" + it
-                        }
-                    }
-                }
-            }
-        }
-    }
-    override val seriesTypeSelector = ".imptdt:contains(Tür) a"
-    override val altName: String = "Alternatif isim: "
-
-    override fun parseStatus(element: String?): Int = when {
-        element == null -> SManga.UNKNOWN
-        listOf("Devam Ediyor").any { it.contains(element, ignoreCase = true) } -> SManga.ONGOING
-        listOf("Tamamlandı").any { it.contains(element, ignoreCase = true) } -> SManga.COMPLETED
-        else -> SManga.UNKNOWN
-    }
-}
diff --git a/multisrc/overrides/wpmangastream/batotoscans/src/BatotoScans.kt b/multisrc/overrides/wpmangastream/batotoscans/src/BatotoScans.kt
deleted file mode 100644
index 66f68c265..000000000
--- a/multisrc/overrides/wpmangastream/batotoscans/src/BatotoScans.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.batotoscans
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-
-class BatotoScans : WPMangaStream("Snudae Scans", "https://snudaescans.com", "en") {
-    override val id = 4418350353197826372L
-}
diff --git a/multisrc/overrides/wpmangastream/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/wpmangastream/default/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index fa71abc5d..000000000
Binary files a/multisrc/overrides/wpmangastream/default/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/wpmangastream/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/wpmangastream/default/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index fbc7bb18b..000000000
Binary files a/multisrc/overrides/wpmangastream/default/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/wpmangastream/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/wpmangastream/default/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index c994c12cc..000000000
Binary files a/multisrc/overrides/wpmangastream/default/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/wpmangastream/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/wpmangastream/default/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index fddb54206..000000000
Binary files a/multisrc/overrides/wpmangastream/default/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/wpmangastream/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/wpmangastream/default/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 154b3ae47..000000000
Binary files a/multisrc/overrides/wpmangastream/default/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/wpmangastream/default/res/web_hi_res_512.png b/multisrc/overrides/wpmangastream/default/res/web_hi_res_512.png
deleted file mode 100644
index 047e5438b..000000000
Binary files a/multisrc/overrides/wpmangastream/default/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/wpmangastream/infernalvoidscans/src/InfernalVoidScans.kt b/multisrc/overrides/wpmangastream/infernalvoidscans/src/InfernalVoidScans.kt
deleted file mode 100644
index d59bf1937..000000000
--- a/multisrc/overrides/wpmangastream/infernalvoidscans/src/InfernalVoidScans.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.infernalvoidscans
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import eu.kanade.tachiyomi.source.model.Page
-import org.jsoup.nodes.Document
-
-class InfernalVoidScans : WPMangaStream("Infernal Void Scans", "https://void-scans.com", "en") {
-    // Site dynamically replaces a placeholder image in the "src" tag with the actual url in "data-src"
-    override fun pageListParse(document: Document): List<Page> {
-        return super.pageListParse(
-            document.apply {
-                select(pageSelector).forEach { pageElem ->
-                    pageElem.attr("data-src")
-                        .takeIf { ! it.isNullOrBlank() }
-                        ?.let { pageElem.attr("src", it) }
-                }
-            }
-        )
-    }
-}
diff --git a/multisrc/overrides/wpmangastream/komikcast/src/KomikCast.kt b/multisrc/overrides/wpmangastream/komikcast/src/KomikCast.kt
deleted file mode 100644
index 651836f3a..000000000
--- a/multisrc/overrides/wpmangastream/komikcast/src/KomikCast.kt
+++ /dev/null
@@ -1,194 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.komikcast
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.Filter
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import kotlinx.serialization.decodeFromString
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonObject
-import okhttp3.Headers
-import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import uy.kohesive.injekt.injectLazy
-import java.util.concurrent.TimeUnit
-
-class KomikCast : WPMangaStream("Komik Cast", "https://komikcast.me", "id") {
-    // Formerly "Komik Cast (WP Manga Stream)"
-    override val id = 972717448578983812
-
-    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
-        .connectTimeout(10, TimeUnit.SECONDS)
-        .readTimeout(30, TimeUnit.SECONDS)
-        .rateLimit(3)
-        .build()
-
-    override fun headersBuilder(): Headers.Builder = Headers.Builder()
-        .add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
-        .add("Accept-language", "en-US,en;q=0.9,id;q=0.8")
-        .add("Referer", baseUrl)
-        .add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0")
-
-    override fun imageRequest(page: Page): Request {
-        val newHeaders = headersBuilder()
-            .set("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
-            .set("Referer", baseUrl)
-            .build()
-
-        return GET(page.imageUrl!!, newHeaders)
-    }
-    override fun popularMangaSelector() = "div.list-update_item"
-
-    override fun popularMangaRequest(page: Int): Request {
-        return GET("$baseUrl/daftar-komik/page/$page/?orderby=popular", headers)
-    }
-
-    override fun latestUpdatesRequest(page: Int): Request {
-        return GET("$baseUrl/komik/page/$page/", headers)
-    }
-
-    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
-        val url = if (query.isNotBlank()) {
-            val url = "$baseUrl/page/$page".toHttpUrlOrNull()!!.newBuilder()
-            val pattern = "\\s+".toRegex()
-            val q = query.replace(pattern, "+")
-            if (query.isNotEmpty()) {
-                url.addQueryParameter("s", q)
-            } else {
-                url.addQueryParameter("s", "")
-            }
-            url.toString()
-        } else {
-            var url = "$baseUrl/daftar-komik/page/$page".toHttpUrlOrNull()!!.newBuilder()
-            var orderBy: String
-            (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
-                when (filter) {
-                    is StatusFilter -> url.addQueryParameter("status", arrayOf("", "ongoing", "completed")[filter.state])
-                    is GenreListFilter -> {
-                        val genreInclude = mutableListOf<String>()
-                        filter.state.forEach {
-                            if (it.state == 1) {
-                                genreInclude.add(it.id)
-                            }
-                        }
-                        if (genreInclude.isNotEmpty()) {
-                            genreInclude.forEach { genre ->
-                                url.addQueryParameter("genre[]", genre)
-                            }
-                        }
-                    }
-                    is SortByFilter -> {
-                        orderBy = filter.toUriPart()
-                        url.addQueryParameter("orderby", orderBy)
-                    }
-                    is ProjectFilter -> {
-                        if (filter.toUriPart() == "project-filter-on") {
-                            url = "$baseUrl/project-list/page/$page".toHttpUrlOrNull()!!.newBuilder()
-                        }
-                    }
-                }
-            }
-            url.toString()
-        }
-        return GET(url, headers)
-    }
-
-    override fun popularMangaFromElement(element: Element): SManga {
-        val manga = SManga.create()
-        element.select("a").first().let {
-            manga.setUrlWithoutDomain(it.attr("href"))
-            manga.title = it.select(".list-update_item-info h3.title").text()
-            manga.thumbnail_url = element.select("div.list-update_item-image img").imgAttr()
-        }
-        return manga
-    }
-
-    override fun mangaDetailsParse(document: Document): SManga {
-        return SManga.create().apply {
-            document.select("div.komik_info").firstOrNull()?.let { infoElement ->
-                genre = infoElement.select(".komik_info-content-genre a").joinToString { it.text() }
-                status = parseStatus(infoElement.select("span:contains(Status:)").firstOrNull()?.ownText())
-                author = infoElement.select("span:contains(Author:)").firstOrNull()?.ownText()
-                artist = infoElement.select("span:contains(Author:)").firstOrNull()?.ownText()
-                description = infoElement.select("div.komik_info-description-sinopsis p").joinToString("\n") { it.text() }
-                thumbnail_url = infoElement.select("div.komik_info-content-thumbnail img").imgAttr()
-
-                // add series type(manga/manhwa/manhua/other) thinggy to genre
-                document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isEmpty().not() && genre!!.contains(it, true).not()) {
-                        genre += if (genre!!.isEmpty()) it else ", $it"
-                    }
-                }
-
-                // add alternative name to manga description
-                document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isBlank().not() && it != "N/A" && it != "-") {
-                        description = when {
-                            description.isNullOrBlank() -> altName + it
-                            else -> description + "\n\n$altName" + it
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    override val seriesTypeSelector = "span:contains(Type) a"
-    override val altNameSelector = ".komik_info-content-native"
-
-    override fun chapterListSelector() = "div.komik_info-chapters li"
-
-    override fun chapterFromElement(element: Element): SChapter {
-        val urlElement = element.select("a").first()
-        val chapter = SChapter.create()
-        chapter.setUrlWithoutDomain(urlElement.attr("href"))
-        chapter.name = urlElement.text()
-        chapter.date_upload = element.select(".chapter-link-time").firstOrNull()?.text()?.let { parseChapterDate(it) } ?: 0
-        return chapter
-    }
-
-    override fun pageListParse(document: Document): List<Page> {
-        var doc = document
-        var cssQuery = "div#chapter_body .main-reading-area img.size-full"
-        val imageListRegex = Regex("chapterImages = (.*) \\|\\|")
-        val imageListMatchResult = imageListRegex.find(document.toString())
-
-        if (imageListMatchResult != null) {
-            val imageListJson = imageListMatchResult.destructured.toList()[0]
-            val imageList = json.parseToJsonElement(imageListJson).jsonObject
-
-            var imageServer = "cdn"
-            if (!imageList.containsKey(imageServer)) imageServer = imageList.keys.first()
-            val imageElement = imageList[imageServer]!!.jsonArray.joinToString("")
-            doc = Jsoup.parse(json.decodeFromString(imageElement))
-            cssQuery = "img.size-full"
-        }
-
-        return doc.select(cssQuery)
-            .mapIndexed { i, img -> Page(i, "", img.attr("abs:Src")) }
-    }
-
-    override fun getFilterList() = FilterList(
-        Filter.Header("NOTE: Ignored if using text search!"),
-        Filter.Separator(),
-        SortByFilter(),
-        Filter.Separator(),
-        StatusFilter(),
-        Filter.Separator(),
-        GenreListFilter(getGenreList()),
-        Filter.Header("NOTE: cant be used with other filter!"),
-        Filter.Header("$name Project List page"),
-        ProjectFilter()
-    )
-
-    private val json: Json by injectLazy()
-}
diff --git a/multisrc/overrides/wpmangastream/komikindoco/src/KomikindoCo.kt b/multisrc/overrides/wpmangastream/komikindoco/src/KomikindoCo.kt
deleted file mode 100644
index de477b2ed..000000000
--- a/multisrc/overrides/wpmangastream/komikindoco/src/KomikindoCo.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.komikindoco
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SManga
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.OkHttpClient
-import org.jsoup.nodes.Document
-import uy.kohesive.injekt.injectLazy
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class KomikindoCo : WPMangaStream("KomikIndo.co", "https://komikindo.co", "id", SimpleDateFormat("MMM dd, yyyy", Locale("id"))) {
-    // Formerly "Komikindo.co"
-    override val id = 734619124437406170
-
-    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
-        .connectTimeout(10, TimeUnit.SECONDS)
-        .readTimeout(30, TimeUnit.SECONDS)
-        .rateLimit(4)
-        .build()
-
-    override val hasProjectPage = true
-
-    override fun mangaDetailsParse(document: Document): SManga {
-        return SManga.create().apply {
-            document.select(".seriestucontent").firstOrNull()?.let { infoElement ->
-                genre = infoElement.select(".seriestugenre a").joinToString { it.text() }
-                status = parseStatus(infoElement.select(".infotable tr:contains(Status) td:last-child").firstOrNull()?.ownText())
-                author = infoElement.select(".infotable tr:contains(Author) td:last-child").firstOrNull()?.ownText()
-                description = infoElement.select(".entry-content-single[itemprop=\"description\"]").joinToString("\n") { it.text() }
-                thumbnail_url = infoElement.select("div.thumb img").imgAttr()
-
-                // add series type(manga/manhwa/manhua/other) thinggy to genre
-                document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isEmpty().not() && genre!!.contains(it, true).not()) {
-                        genre += if (genre!!.isEmpty()) it else ", $it"
-                    }
-                }
-
-                // add alternative name to manga description
-                document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isBlank().not() && it != "N/A" && it != "-") {
-                        description = when {
-                            description.isNullOrBlank() -> altName + it
-                            else -> description + "\n\n$altName" + it
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private val json: Json by injectLazy()
-
-    override fun pageListParse(document: Document): List<Page> {
-        val pages = mutableListOf<Page>()
-        document.select(pageSelector)
-            .filterNot { it.attr("src").isNullOrEmpty() }
-            .mapIndexed { i, img -> pages.add(Page(i, "", img.attr("abs:src"))) }
-
-        // Some sites like mangakita now load pages via javascript
-        if (pages.isNotEmpty()) { return pages }
-
-        val docString = document.toString()
-        val imageListRegex = Regex("\\\"images.*?:.*?(\\[.*?\\])")
-        val imageListJson = imageListRegex.find(docString)!!.destructured.toList()[0]
-
-        val imageList = json.parseToJsonElement(imageListJson).jsonArray
-
-        pages += imageList.mapIndexed { i, jsonEl ->
-            Page(i, "", jsonEl.jsonPrimitive.content)
-        }
-
-        return pages
-    }
-}
diff --git a/multisrc/overrides/wpmangastream/komikstation/src/KomikStation.kt b/multisrc/overrides/wpmangastream/komikstation/src/KomikStation.kt
deleted file mode 100644
index 0ae354eb6..000000000
--- a/multisrc/overrides/wpmangastream/komikstation/src/KomikStation.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.komikstation
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.Page
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.OkHttpClient
-import org.jsoup.nodes.Document
-import uy.kohesive.injekt.injectLazy
-import java.util.concurrent.TimeUnit
-
-class KomikStation : WPMangaStream("Komik Station", "https://komikstation.co", "id") {
-    // Formerly "Komik Station (WP Manga Stream)"
-    override val id = 6148605743576635261
-
-    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
-        .connectTimeout(10, TimeUnit.SECONDS)
-        .readTimeout(30, TimeUnit.SECONDS)
-        .rateLimit(4)
-        .build()
-
-    private val json: Json by injectLazy()
-
-    override fun pageListParse(document: Document): List<Page> {
-        val pages = mutableListOf<Page>()
-        document.select(pageSelector)
-            .filterNot { it.attr("abs:src").isNullOrEmpty() }
-            .mapIndexed { i, img -> pages.add(Page(i, "", img.attr("abs:src"))) }
-
-        // Some sites like mangakita now load pages via javascript
-        if (pages.isNotEmpty()) { return pages }
-
-        val docString = document.toString()
-        val imageListRegex = Regex("\\\"images.*?:.*?(\\[.*?\\])")
-        val imageListJson = imageListRegex.find(docString)!!.destructured.toList()[0]
-
-        val imageList = json.parseToJsonElement(imageListJson).jsonArray
-
-        pages += imageList.mapIndexed { i, jsonEl ->
-            Page(i, "", jsonEl.jsonPrimitive.content)
-        }
-
-        return pages
-    }
-
-    override val projectPageString = "/project-list"
-
-    override val hasProjectPage = true
-}
diff --git a/multisrc/overrides/wpmangastream/mangaswat/src/MangaSwat.kt b/multisrc/overrides/wpmangastream/mangaswat/src/MangaSwat.kt
deleted file mode 100644
index d51eb5266..000000000
--- a/multisrc/overrides/wpmangastream/mangaswat/src/MangaSwat.kt
+++ /dev/null
@@ -1,170 +0,0 @@
-package eu.kanade.tachiyomi.extension.ar.mangaswat
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.Filter
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.Headers
-import okhttp3.Request
-import org.json.JSONObject
-import org.jsoup.nodes.Document
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaSwat : WPMangaStream(
-    "MangaSwat",
-    "https://swatmanga.co",
-    "ar",
-    SimpleDateFormat("yyyy-MM-dd", Locale.US)
-) {
-
-    override fun headersBuilder(): Headers.Builder = Headers.Builder()
-        .add(
-            "Accept",
-            "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
-        )
-        .add("Accept-language", "en-US,en;q=0.9")
-        .add("Referer", baseUrl)
-
-    override fun imageRequest(page: Page): Request {
-        val newHeaders = headersBuilder()
-            .set("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
-            .set("Referer", baseUrl)
-            .build()
-        return GET(page.imageUrl!!, newHeaders)
-    }
-
-    override fun mangaDetailsParse(document: Document): SManga {
-        return SManga.create().apply {
-            document.select("div.bigcontent").firstOrNull()?.let { infoElement ->
-                genre = infoElement.select("span:contains(التصنيف) a").joinToString { it.text() }
-                status = parseStatus(
-                    infoElement.select("span:contains(الحالة)").firstOrNull()?.ownText()
-                )
-                author = infoElement.select("span:contains(المؤلف)").firstOrNull()?.ownText()
-                artist = infoElement.select("span:contains(الناشر) i").firstOrNull()?.ownText()
-                description = infoElement.select("div.desc").text()
-                thumbnail_url = infoElement.select("img").imgAttr()
-
-                val genres = infoElement.select("span:contains(التصنيف) a, .mgen a")
-                    .map { element -> element.text().lowercase() }
-                    .toMutableSet()
-
-                // add series type(manga/manhwa/manhua/other) thinggy to genre
-                document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isEmpty().not() && genres.contains(it).not()) {
-                        genres.add(it.lowercase())
-                    }
-                }
-
-                genre = genres.toList().map { it.capitalize() }.joinToString(", ")
-            }
-        }
-    }
-
-    override val seriesTypeSelector = "span:contains(النوع) a"
-
-    override val pageSelector = "div#readerarea img"
-
-    override fun pageListParse(document: Document): List<Page> {
-        var page: List<Page>? = null
-        val scriptContent = document.selectFirst("script:containsData(ts_reader)").data()
-        val removeHead = scriptContent.replace("ts_reader.run(", "").replace(");", "")
-        val jsonObject = JSONObject(removeHead)
-        val sourcesArray = jsonObject.getJSONArray("sources")
-        val imagesArray = sourcesArray.getJSONObject(0).getJSONArray("images")
-        page = List(imagesArray.length()) { i ->
-            Page(i, "", imagesArray[i].toString())
-        }
-
-        return page!!
-    }
-
-    override fun getFilterList() = FilterList(
-        SortByFilter(),
-        Filter.Separator(),
-        StatusFilter(),
-        Filter.Separator(),
-        TypeFilter(),
-        Filter.Separator(),
-        Filter.Header("Genre exclusion not available for all sources"),
-        GenreListFilter(getGenreList()),
-    )
-
-    override fun getGenreList(): List<Genre> = listOf(
-        Genre("<--->", ""),
-        Genre("Adult", "adult"),
-        Genre("آلات", "%d8%a2%d9%84%d8%a7%d8%aa"),
-        Genre("أكشن", "%d8%a3%d9%83%d8%b4%d9%86"),
-        Genre("إثارة", "%d8%a5%d8%ab%d8%a7%d8%b1%d8%a9"),
-        Genre("إعادة إحياء", "%d8%a5%d8%b9%d8%a7%d8%af%d8%a9-%d8%a5%d8%ad%d9%8a%d8%a7%d8%a1"),
-        Genre(
-            "الحياة المدرسية",
-            "%d8%a7%d9%84%d8%ad%d9%8a%d8%a7%d8%a9-%d8%a7%d9%84%d9%85%d8%af%d8%b1%d8%b3%d9%8a%d8%a9"
-        ),
-        Genre(
-            "الحياة اليومية",
-            "%d8%a7%d9%84%d8%ad%d9%8a%d8%a7%d8%a9-%d8%a7%d9%84%d9%8a%d9%88%d9%85%d9%8a%d8%a9"
-        ),
-        Genre("العاب فيديو", "%d8%a7%d9%84%d8%b9%d8%a7%d8%a8-%d9%81%d9%8a%d8%af%d9%8a%d9%88"),
-        Genre("ايتشي", "%d8%a7%d9%8a%d8%aa%d8%b4%d9%8a"),
-        Genre("ايسكاي", "%d8%a7%d9%8a%d8%b3%d9%83%d8%a7%d9%8a"),
-        Genre("بالغ", "%d8%a8%d8%a7%d9%84%d8%ba"),
-        Genre("تاريخي", "%d8%aa%d8%a7%d8%b1%d9%8a%d8%ae%d9%8a"),
-        Genre("تراجيدي", "%d8%aa%d8%b1%d8%a7%d8%ac%d9%8a%d8%af%d9%8a"),
-        Genre("تناسخ", "%d8%aa%d9%86%d8%a7%d8%b3%d8%ae"),
-        Genre("جريمة", "%d8%ac%d8%b1%d9%8a%d9%85%d8%a9"),
-        Genre("جوسيه", "%d8%ac%d9%88%d8%b3%d9%8a%d9%87"),
-        Genre("جيندر بندر", "%d8%ac%d9%8a%d9%86%d8%af%d8%b1-%d8%a8%d9%86%d8%af%d8%b1"),
-        Genre("حديث", "%d8%ad%d8%af%d9%8a%d8%ab"),
-        Genre("حربي", "%d8%ad%d8%b1%d8%a8%d9%8a"),
-        Genre("حريم", "%d8%ad%d8%b1%d9%8a%d9%85"),
-        Genre(
-            "خارق للطبيعة",
-            "%d8%ae%d8%a7%d8%b1%d9%82-%d9%84%d9%84%d8%b7%d8%a8%d9%8a%d8%b9%d8%a9"
-        ),
-        Genre("خيال", "%d8%ae%d9%8a%d8%a7%d9%84"),
-        Genre("خيال علمي", "%d8%ae%d9%8a%d8%a7%d9%84-%d8%b9%d9%84%d9%85%d9%8a"),
-        Genre("دراما", "%d8%af%d8%b1%d8%a7%d9%85%d8%a7"),
-        Genre("دموي", "%d8%af%d9%85%d9%88%d9%8a"),
-        Genre("راشد", "%d8%af%d9%85%d9%88%d9%8a"),
-        Genre("رعب", "%d8%b1%d8%b9%d8%a8"),
-        Genre("رومانسي", "%d8%b1%d9%88%d9%85%d8%a7%d9%86%d8%b3%d9%8a"),
-        Genre("رياضة", "%d8%b1%d9%8a%d8%a7%d8%b6%d8%a9"),
-        Genre("زمكاني", "%d8%b2%d9%85%d9%83%d8%a7%d9%86%d9%8a"),
-        Genre("زومبي", "%d8%b2%d9%88%d9%85%d8%a8%d9%8a"),
-        Genre("سحر", "%d8%b3%d8%ad%d8%b1"),
-        Genre("سينين", "%d8%b3%d9%8a%d9%86%d9%8a%d9%86"),
-        Genre(
-            "شريحة من الحياة",
-            "%d8%b4%d8%b1%d9%8a%d8%ad%d8%a9-%d9%85%d9%86-%d8%a7%d9%84%d8%ad%d9%8a%d8%a7%d8%a9"
-        ),
-        Genre("شوجو", "%d8%b4%d9%88%d8%ac%d9%88"),
-        Genre("شونين", "%d8%b4%d9%88%d9%86%d9%8a%d9%86"),
-        Genre("شياطين", "%d8%b4%d9%8a%d8%a7%d8%b7%d9%8a%d9%86"),
-        Genre("طبخ", "%d8%b7%d8%a8%d8%ae"),
-        Genre("طبي", "%d8%b7%d8%a8%d9%8a"),
-        Genre("غموض", "%d8%ba%d9%85%d9%88%d8%b6"),
-        Genre("فانتازي", "%d9%81%d8%a7%d9%86%d8%aa%d8%a7%d8%b2%d9%8a"),
-        Genre("فنون قتالية", "%d9%81%d9%86%d9%88%d9%86-%d9%82%d8%aa%d8%a7%d9%84%d9%8a%d8%a9"),
-        Genre("فوق الطبيعة", "%d9%81%d9%88%d9%82-%d8%a7%d9%84%d8%b7%d8%a8%d9%8a%d8%b9%d8%a9"),
-        Genre("قوى خارقة", "%d9%82%d9%88%d9%89-%d8%ae%d8%a7%d8%b1%d9%82%d8%a9"),
-        Genre("كوميدي", "%d9%83%d9%88%d9%85%d9%8a%d8%af%d9%8a"),
-        Genre("لعبة", "%d9%84%d8%b9%d8%a8%d8%a9"),
-        Genre("مافيا", "%d9%85%d8%a7%d9%81%d9%8a%d8%a7"),
-        Genre(
-            "مصاصى الدماء",
-            "%d9%85%d8%b5%d8%a7%d8%b5%d9%89-%d8%a7%d9%84%d8%af%d9%85%d8%a7%d8%a1"
-        ),
-        Genre("مغامرات", "%d9%85%d8%ba%d8%a7%d9%85%d8%b1%d8%a7%d8%aa"),
-        Genre("موريم", "%d9%85%d9%88%d8%b1%d9%8a%d9%85"),
-        Genre("موسيقي", "%d9%85%d9%88%d8%b3%d9%8a%d9%82%d9%89"),
-        Genre("ميشا", "%d9%85%d9%8a%d8%b4%d8%a7"),
-        Genre("ميكا", "%d9%85%d9%8a%d9%83%d8%a7"),
-        Genre("نفسي", "%d9%86%d9%81%d8%b3%d9%8a"),
-        Genre("وحوش", "%d9%88%d8%ad%d9%88%d8%b4"),
-        Genre("ويب-تون", "%d9%88%d9%8a%d8%a8-%d8%aa%d9%88%d9%86")
-    )
-}
diff --git a/multisrc/overrides/wpmangastream/mihentai/src/Mihentai.kt b/multisrc/overrides/wpmangastream/mihentai/src/Mihentai.kt
deleted file mode 100644
index 2aec935c2..000000000
--- a/multisrc/overrides/wpmangastream/mihentai/src/Mihentai.kt
+++ /dev/null
@@ -1,179 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mihentai
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.Filter
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SManga
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
-import okhttp3.Request
-import org.jsoup.nodes.Document
-import uy.kohesive.injekt.injectLazy
-import java.util.Locale
-
-class Mihentai : WPMangaStream("Mihentai", "https://mihentai.com", "en") {
-    override fun popularMangaRequest(page: Int): Request {
-        return GET("$baseUrl/manga/page/$page/?order=popular", headers)
-    }
-
-    override fun latestUpdatesRequest(page: Int): Request {
-        return GET("$baseUrl/manga/page/$page/?order=update", headers)
-    }
-
-    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
-        val url = "$baseUrl/manga/page/$page/".toHttpUrlOrNull()!!.newBuilder()
-        url.addQueryParameter("title", query)
-        filters.forEach { filter ->
-            when (filter) {
-                is StatusFilter -> url.addQueryParameter("status", filter.toUriPart())
-                is TypeFilter -> url.addQueryParameter("type", filter.toUriPart())
-                is SortByFilter -> url.addQueryParameter("order", filter.toUriPart())
-                is GenreListFilter -> {
-                    filter.state
-                        .filter { it.state != Filter.TriState.STATE_IGNORE }
-                        .forEach { url.addQueryParameter("genre[]", it.id) }
-                }
-            }
-        }
-        return GET(url.build().toString(), headers)
-    }
-
-    override fun mangaDetailsParse(document: Document): SManga {
-        return SManga.create().apply {
-            document.select("div.bigcontent, div.animefull, div.main-info").firstOrNull()?.let { infoElement ->
-                status = parseStatus(infoElement.select("span:contains(Status:), .imptdt:contains(Status) i").firstOrNull()?.ownText())
-                thumbnail_url = infoElement.select("div.thumb img").imgAttr()
-
-                val genres = infoElement.select("span:contains(Tag) a")
-                    .map { element -> element.text().lowercase(Locale.ROOT) }
-                    .toMutableSet()
-
-                // add series type(manga/manhwa/manhua/other) thinggy to genre
-                document.select("span:contains(Type)").firstOrNull()?.ownText()?.let {
-                    if (it.isEmpty().not() && genres.contains(it).not()) {
-                        genres.add(it.lowercase(Locale.ROOT))
-                    }
-                }
-
-                genre = genres.toList().joinToString(", ") { it.capitalize(Locale.ROOT) }
-            }
-        }
-    }
-
-    override fun parseStatus(element: String?): Int = when {
-        element == null -> SManga.UNKNOWN
-        listOf("ongoing", "publishing").any { it.contains(element, ignoreCase = true) } -> SManga.ONGOING
-        listOf("finished").any { it.contains(element, ignoreCase = true) } -> SManga.COMPLETED
-        else -> SManga.UNKNOWN
-    }
-
-    private val json: Json by injectLazy()
-
-    override fun pageListParse(document: Document): List<Page> {
-        val htmlPages = document.select(pageSelector)
-            .filterNot { it.attr("abs:src").isNullOrEmpty() }
-            .mapIndexed { i, img ->
-                val pageUrl = img.attr("abs:src").substringAfter(baseUrl).prependIndent(baseUrl)
-                Page(i, "", pageUrl)
-            }
-            .toMutableList()
-
-        val docString = document.toString()
-        val imageListRegex = Regex("\\\"images.*?:.*?(\\[.*?\\])")
-        val imageListJson = imageListRegex.find(docString)?.destructured?.toList()?.get(0)
-        if (imageListJson != null) {
-            val imageList = json.parseToJsonElement(imageListJson).jsonArray
-            val baseResolver = baseUrl.toHttpUrl()
-
-            val scriptPages = imageList.mapIndexed { i, jsonEl ->
-                val imageUrl = jsonEl.jsonPrimitive.content
-                Page(i, "", baseResolver.resolve(imageUrl).toString())
-            }
-
-            if (htmlPages.size < scriptPages.size) {
-                htmlPages += scriptPages
-            }
-        }
-
-        countViews(document)
-
-        return htmlPages.distinctBy { it.imageUrl }
-    }
-
-    private class StatusFilter : UriPartFilter(
-        "Status",
-        arrayOf(
-            Pair("All", ""),
-            Pair("Publishing", "publishing"),
-            Pair("Finished", "finished"),
-            Pair("Dropped", "drop")
-        )
-    )
-
-    private class TypeFilter : UriPartFilter(
-        "Type",
-        arrayOf(
-            Pair("Default", ""),
-            Pair("Manga", "Manga"),
-            Pair("Manhwa", "Manhwa"),
-            Pair("Manhua", "Manhua"),
-            Pair("Webtoon", "webtoon"),
-            Pair("One-Shot", "One-Shot"),
-            Pair("Doujin", "doujin")
-        )
-    )
-
-    override fun getFilterList(): FilterList = FilterList(
-        listOf(
-            StatusFilter(),
-            TypeFilter(),
-            SortByFilter(),
-            GenreListFilter(getGenreList())
-        )
-    )
-
-    override fun getGenreList(): List<Genre> = listOf(
-        Genre("Adventure", "adventure"),
-        Genre("Ahego", "ahego"),
-        Genre("Anal", "anal"),
-        Genre("Battle", "battle"),
-        Genre("Big Breasts", "big-breasts"),
-        Genre("Blowjob", "blowjob"),
-        Genre("Comic 3D", "comic-3d"),
-        Genre("Doujin", "doujin"),
-        Genre("Dragon ball", "dragon-ball"),
-        Genre("Fingering", "fingering"),
-        Genre("Full color", "full-color"),
-        Genre("Futanari", "futanari"),
-        Genre("Girlfriend", "girlfriend"),
-        Genre("Grouped", "grouped"),
-        Genre("Handjob", "handjob"),
-        Genre("Hijab", "hijab"),
-        Genre("Incest", "incest"),
-        Genre("Kissing", "kissing"),
-        Genre("Mama", "mama"),
-        Genre("Manga", "manga"),
-        Genre("Masturbation", "masturbation"),
-        Genre("Milf", "milf"),
-        Genre("Mom & Son", "mom-son"),
-        Genre("Naruto", "naruto"),
-        Genre("One Piece", "one-piece"),
-        Genre("Pregnancy", "pregnancy"),
-        Genre("Rape", "rape"),
-        Genre("Romance", "romance"),
-        Genre("School", "school"),
-        Genre("Scooby-Doo", "scooby-doo"),
-        Genre("Sister", "sister"),
-        Genre("Stocking", "stocking"),
-        Genre("Sub Indo", "sub-indo"),
-        Genre("Threesome", "threesome"),
-        Genre("Uncensored", "uncensored"),
-        Genre("Western", "western"),
-        Genre("Yuri", "yuri")
-    )
-}
diff --git a/multisrc/overrides/wpmangastream/noxsubs/src/NoxSubs.kt b/multisrc/overrides/wpmangastream/noxsubs/src/NoxSubs.kt
deleted file mode 100644
index 147f82474..000000000
--- a/multisrc/overrides/wpmangastream/noxsubs/src/NoxSubs.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.tr.noxsubs
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class NoxSubs : WPMangaStream("NoxSubs", "https://noxsubs.com", "tr", SimpleDateFormat("MMM d, yyyy", Locale("tr")))
diff --git a/multisrc/overrides/wpmangastream/phoenixfansub/src/PhoenixFansub.kt b/multisrc/overrides/wpmangastream/phoenixfansub/src/PhoenixFansub.kt
deleted file mode 100644
index e78e4aca6..000000000
--- a/multisrc/overrides/wpmangastream/phoenixfansub/src/PhoenixFansub.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.phoenixfansub
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class PhoenixFansub : WPMangaStream(
-    "Phoenix Fansub",
-    "https://phoenixfansub.com",
-    "es",
-    SimpleDateFormat("MMM d, yyyy", Locale("es"))
-) {
-
-    override val altName: String = "Nombre alternativo: "
-}
diff --git a/multisrc/overrides/wpmangastream/westmanga/src/WestManga.kt b/multisrc/overrides/wpmangastream/westmanga/src/WestManga.kt
deleted file mode 100644
index 32c7999c6..000000000
--- a/multisrc/overrides/wpmangastream/westmanga/src/WestManga.kt
+++ /dev/null
@@ -1,121 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.westmanga
-
-import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.OkHttpClient
-import org.jsoup.nodes.Document
-import java.util.concurrent.TimeUnit
-
-class WestManga : WPMangaStream("West Manga", "https://westmanga.info", "id") {
-    // Formerly "West Manga (WP Manga Stream)"
-    override val id = 8883916630998758688
-
-    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
-        .connectTimeout(10, TimeUnit.SECONDS)
-        .readTimeout(30, TimeUnit.SECONDS)
-        .rateLimit(4)
-        .build()
-
-    override fun mangaDetailsParse(document: Document): SManga {
-        return SManga.create().apply {
-            document.select(".seriestucontent").firstOrNull()?.let { infoElement ->
-                genre = infoElement.select(".seriestugenre a").joinToString { it.text() }
-                status = parseStatus(infoElement.select(".infotable tr:contains(Status) td:last-child").firstOrNull()?.ownText())
-                author = infoElement.select(".infotable tr:contains(Author) td:last-child").firstOrNull()?.ownText()
-                description = infoElement.select(".entry-content-single[itemprop=\"description\"]").joinToString("\n") { it.text() }
-                thumbnail_url = infoElement.select("div.thumb img").imgAttr()
-
-                // add series type(manga/manhwa/manhua/other) thinggy to genre
-                document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isEmpty().not() && genre!!.contains(it, true).not()) {
-                        genre += if (genre!!.isEmpty()) it else ", $it"
-                    }
-                }
-
-                // add alternative name to manga description
-                document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isBlank().not() && it != "N/A" && it != "-") {
-                        description = when {
-                            description.isNullOrBlank() -> altName + it
-                            else -> description + "\n\n$altName" + it
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    override val seriesTypeSelector = ".infotable tr:contains(Type) td:last-child"
-    override fun getGenreList(): List<Genre> = listOf(
-        Genre("4 Koma", "344"),
-        Genre("Action", "13"),
-        Genre("Adventure", "4"),
-        Genre("Anthology", "1494"),
-        Genre("Comedy", "5"),
-        Genre("Cooking", "54"),
-        Genre("Crime", "856"),
-        Genre("Crossdressing", "1306"),
-        Genre("Demon", "64"),
-        Genre("Drama", "6"),
-        Genre("Ecchi", "14"),
-        Genre("Fantasy", "7"),
-        Genre("Game", "36"),
-        Genre("Gender Bender", "149"),
-        Genre("Genderswap", "157"),
-        Genre("Gore", "56"),
-        Genre("Gyaru", "812"),
-        Genre("Harem", "17"),
-        Genre("Historical", "44"),
-        Genre("Horror", "211"),
-        Genre("Isekai", "20"),
-        Genre("Isekai Action", "742"),
-        Genre("Josei", "164"),
-        Genre("Magic", "65"),
-        Genre("Manga", "268"),
-        Genre("Manhua", "32"),
-        Genre("Martial Art", "754"),
-        Genre("Martial Arts", "8"),
-        Genre("Mature", "46"),
-        Genre("Mecha", "22"),
-        Genre("Medical", "704"),
-        Genre("Medy", "1439"),
-        Genre("Monsters", "91"),
-        Genre("Music", "457"),
-        Genre("Mystery", "30"),
-        Genre("Office Workers", "1501"),
-        Genre("Oneshot", "405"),
-        Genre("Project", "313"),
-        Genre("Psychological", "23"),
-        Genre("Reincarnation", "57"),
-        Genre("Reinkarnasi", "1170"),
-        Genre("Romance", "15"),
-        Genre("School", "102"),
-        Genre("School Life", "9"),
-        Genre("Sci-fi", "33"),
-        Genre("Seinen", "18"),
-        Genre("Shotacon", "1070"),
-        Genre("Shoujo", "110"),
-        Genre("Shoujo Ai", "113"),
-        Genre("Shounen", "10"),
-        Genre("Shounen Ai", "shounen-ai"),
-        Genre("Si-fi", "776"),
-        Genre("Slice of Lif", "773"),
-        Genre("Slice of Life", "11"),
-        Genre("Smut", "586"),
-        Genre("Sports", "103"),
-        Genre("Super Power", "274"),
-        Genre("Supernatural", "34"),
-        Genre("Suspense", "181"),
-        Genre("Thriller", "170"),
-        Genre("Tragedy", "92"),
-        Genre("Urban", "1050"),
-        Genre("Vampire", "160"),
-        Genre("Video Games", "1093"),
-        Genre("Webtoons", "486"),
-        Genre("Yaoi", "yaoi"),
-        Genre("Zombies", "377")
-    )
-
-    override val hasProjectPage = true
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesia.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesia.kt
new file mode 100644
index 000000000..70e58bb3a
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesia.kt
@@ -0,0 +1,476 @@
+package eu.kanade.tachiyomi.multisrc.mangathemesia
+
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.source.model.Filter
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.MangasPage
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.source.online.ParsedHttpSource
+import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonPrimitive
+import okhttp3.FormBody
+import okhttp3.HttpUrl
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import okhttp3.Response
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import org.jsoup.select.Elements
+import rx.Observable
+import uy.kohesive.injekt.injectLazy
+import java.lang.IllegalArgumentException
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+abstract class MangaThemesia(
+    override val name: String,
+    override val baseUrl: String,
+    override val lang: String,
+    val mangaUrlDirectory: String = "/manga",
+    private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US)
+) : ParsedHttpSource() {
+
+    protected open val json: Json by injectLazy()
+
+    override val supportsLatest = true
+
+    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+        .connectTimeout(10, TimeUnit.SECONDS)
+        .readTimeout(30, TimeUnit.SECONDS)
+        .build()
+
+    open val projectPageString = "/project"
+
+    // Popular (Search with popular order and nothing else)
+    override fun popularMangaRequest(page: Int) = searchMangaRequest(page, "", FilterList(OrderByFilter("popular")))
+    override fun popularMangaParse(response: Response) = searchMangaParse(response)
+
+    // Latest (Search with update order and nothing else)
+    override fun latestUpdatesRequest(page: Int) = searchMangaRequest(page, "", FilterList(OrderByFilter("update")))
+    override fun latestUpdatesParse(response: Response) = searchMangaParse(response)
+
+    // Search
+    override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
+        if (query.startsWith(URL_SEARCH_PREFIX).not()) return super.fetchSearchManga(page, query, filters)
+
+        val mangaPath = try {
+            mangaPathFromUrl(query.substringAfter(URL_SEARCH_PREFIX))
+                ?: return Observable.just(MangasPage(emptyList(), false))
+        } catch (e: Exception) {
+            return Observable.error(e)
+        }
+
+        return fetchMangaDetails(
+            SManga.create()
+                .apply { this.url = "$mangaUrlDirectory/$mangaPath" }
+        )
+            .map {
+                // Isn't set in returned manga
+                it.url = "$mangaUrlDirectory/$id"
+                MangasPage(listOf(it), false)
+            }
+    }
+
+    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+        val url = baseUrl.toHttpUrl().newBuilder()
+        if (query.isNotEmpty()) {
+            url.addPathSegments("page/$page").addQueryParameter("s", query)
+        } else {
+            url.addPathSegment(mangaUrlDirectory.substring(1)).addQueryParameter("page", page.toString())
+            filters.forEach { filter ->
+                when (filter) {
+                    is AuthorFilter -> {
+                        url.addQueryParameter("author", filter.state)
+                    }
+                    is YearFilter -> {
+                        url.addQueryParameter("yearx", filter.state)
+                    }
+                    is StatusFilter -> {
+                        url.addQueryParameter("status", filter.selectedValue)
+                    }
+                    is TypeFilter -> {
+                        url.addQueryParameter("type", filter.selectedValue)
+                    }
+                    is OrderByFilter -> {
+                        url.addQueryParameter("order", filter.selectedValue)
+                    }
+                    is GenreListFilter -> {
+                        filter.state
+                            .filter { it.state != Filter.TriState.STATE_IGNORE }
+                            .forEach {
+                                val value = if (it.state == Filter.TriState.STATE_EXCLUDE) "-${it.value}" else it.value
+                                url.addQueryParameter("genre[]", value)
+                            }
+                    }
+                    // if site has project page, default value "hasProjectPage" = false
+                    is ProjectFilter -> {
+                        if (filter.selectedValue == "project-filter-on") {
+                            url.setPathSegment(0, projectPageString.substring(1))
+                        }
+                    }
+                    else -> { /* Do Nothing */ }
+                }
+            }
+        }
+        return GET(url.toString())
+    }
+
+    override fun searchMangaParse(response: Response): MangasPage {
+        if (genrelist == null) {
+            genrelist = parseGenres(response.asJsoup(response.peekBody(Long.MAX_VALUE).string()))
+        }
+
+        return super.searchMangaParse(response)
+    }
+
+    override fun searchMangaSelector() = ".utao .uta .imgu, .listupd .bs .bsx, .listo .bs .bsx"
+
+    override fun searchMangaFromElement(element: Element) = SManga.create().apply {
+        thumbnail_url = element.select("img").imgAttr()
+        title = element.select("a").attr("title")
+        setUrlWithoutDomain(element.select("a").attr("href"))
+    }
+
+    override fun searchMangaNextPageSelector() = "div.pagination .next, div.hpage .r"
+
+    // Manga details
+    open val seriesDetailsSelector = "div.bigcontent, div.animefull, div.main-info"
+    open val seriesTitleSelector = "h1.entry-title"
+    open val seriesArtistSelector = ".infotable tr:contains(artist) td:last-child, .tsinfo .imptdt:contains(artist) i, .fmed b:contains(artist)+span, span:contains(artist)"
+    open val seriesAuthorSelector = ".infotable tr:contains(author) td:last-child, .tsinfo .imptdt:contains(author) i, .fmed b:contains(author)+span, span:contains(author)"
+    open val seriesDescriptionSelector = ".desc, .entry-content[itemprop=description]"
+    open val seriesAltNameSelector = ".alternative, .wd-full:contains(alt) span, .alter, .seriestualt"
+    open val seriesGenreSelector = "div.gnr a, .mgen a, .seriestugenre a, span:contains(genre)"
+    open val seriesTypeSelector = ".infotable tr:contains(type) td:last-child, .tsinfo .imptdt:contains(type) i, .fmed b:contains(type)+span, span:contains(type) a, a[href*=type\\=]"
+    open val seriesStatusSelector = ".infotable tr:contains(status) td:last-child, .tsinfo .imptdt:contains(status) i, .fmed b:contains(status)+span span:contains(status)"
+    open val seriesThumbnailSelector = ".infomanga > div[itemprop=image] img, .thumb img"
+
+    open val altNamePrefix = "Alternative Name: "
+
+    override fun mangaDetailsParse(document: Document) = SManga.create().apply {
+        document.selectFirst(seriesDetailsSelector).let { seriesDetails ->
+            title = seriesDetails.selectFirst(seriesTitleSelector)?.text().orEmpty()
+            artist = seriesDetails.selectFirst(seriesArtistSelector)?.ownText().removeEmptyPlaceholder()
+            author = seriesDetails.selectFirst(seriesAuthorSelector)?.ownText().removeEmptyPlaceholder()
+            description = seriesDetails.select(seriesDescriptionSelector).joinToString("\n") { it.text() }
+            // Add alternative name to manga description
+            val altName = seriesDetails.selectFirst(seriesAltNameSelector)?.ownText().takeIf { it.isNullOrBlank().not() }
+            altName?.let {
+                description = "$description\n\n$altNamePrefix$altName".trim()
+            }
+            val genres = seriesDetails.select(seriesGenreSelector).map { it.text() }.toMutableList()
+            // Add series type (manga/manhwa/manhua/other) to genre
+            seriesDetails.selectFirst(seriesTypeSelector)?.ownText().takeIf { it.isNullOrBlank().not() }?.let { genres.add(it) }
+            genre = genres.map { genre ->
+                genre.lowercase(Locale.forLanguageTag(lang)).replaceFirstChar { char ->
+                    if (char.isLowerCase()) char.titlecase(Locale.forLanguageTag(lang))
+                    else char.toString()
+                }
+            }
+                .joinToString { it.trim() }
+
+            status = seriesDetails.selectFirst(seriesStatusSelector)?.text().parseStatus()
+            thumbnail_url = seriesDetails.select(seriesThumbnailSelector).imgAttr()
+        }
+    }
+
+    private fun String?.removeEmptyPlaceholder(): String? {
+        return if (this.isNullOrBlank() || this == "-" || this == "N/A") null else this
+    }
+
+    open fun String?.parseStatus(): Int = when {
+        this == null -> SManga.UNKNOWN
+        listOf("ongoing", "publishing").any { this.contains(it, ignoreCase = true) } -> SManga.ONGOING
+        this.contains("completed", ignoreCase = true) -> SManga.COMPLETED
+        else -> SManga.UNKNOWN
+    }
+
+    // Chapter list
+    override fun chapterListSelector() = "div.bxcl li, div.cl li, #chapterlist li .eph-num, li:has(div.chbox):has(div.eph-num)"
+
+    override fun chapterListParse(response: Response): List<SChapter> {
+        val document = response.asJsoup()
+        val chapters = document.select(chapterListSelector()).map { chapterFromElement(it) }
+
+        // Add timestamp to latest chapter, taken from "Updated On".
+        // So source which not provide chapter timestamp will have at least one
+        if (chapters.isNotEmpty() && chapters.first().date_upload == 0L) {
+            val date = document
+                .select(".listinfo time[itemprop=dateModified], .fmed:contains(update) time, span:contains(update) time")
+                .attr("datetime")
+            if (date.isNotEmpty()) chapters.first().date_upload = parseUpdatedOnDate(date)
+        }
+
+        countViews(document)
+
+        return chapters
+    }
+
+    private fun parseUpdatedOnDate(date: String): Long {
+        return SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(date)?.time ?: 0L
+    }
+
+    override fun chapterFromElement(element: Element) = SChapter.create().apply {
+        val urlElements = element.select("a")
+        setUrlWithoutDomain(urlElements.attr("href"))
+        name = element.select(".lch a, .chapternum").text().ifBlank { urlElements.first().text() }
+        date_upload = element.selectFirst(".chapterdate")?.text().parseChapterDate()
+    }
+
+    protected open fun String?.parseChapterDate(): Long {
+        if (this == null) return 0
+        return try {
+            dateFormat.parse(this)?.time ?: 0
+        } catch (_: Exception) {
+            0
+        }
+    }
+
+    // Pages
+    open val pageSelector = "div#readerarea img"
+
+    override fun pageListParse(document: Document): List<Page> {
+        val htmlPages = document.select(pageSelector)
+            .filterNot { it.imgAttr().isEmpty() }
+            .mapIndexed { i, img -> Page(i, "", img.imgAttr()) }
+
+        countViews(document)
+
+        // Some sites also loads pages via javascript
+        if (htmlPages.isNotEmpty()) { return htmlPages }
+
+        val docString = document.toString()
+        val imageListJson = JSON_IMAGE_LIST_REGEX.find(docString)?.destructured?.toList()?.get(0).orEmpty()
+        val imageList = try {
+            json.parseToJsonElement(imageListJson).jsonArray
+        } catch (_: IllegalArgumentException) {
+            emptyList()
+        }
+        val scriptPages = imageList.mapIndexed { i, jsonEl ->
+            Page(i, "", jsonEl.jsonPrimitive.content)
+        }
+
+        return scriptPages
+    }
+
+    /**
+     * Set it to false if you want to disable the extension reporting the view count
+     * back to the source website through admin-ajax.php.
+     */
+    protected open val sendViewCount: Boolean = true
+
+    protected open fun countViewsRequest(document: Document): Request? {
+        val wpMangaData = document.select("script:containsData(dynamic_view_ajax)").firstOrNull()
+            ?.data() ?: return null
+
+        val postId = CHAPTER_PAGE_ID_REGEX.find(wpMangaData)?.groupValues?.get(1)
+            ?: MANGA_PAGE_ID_REGEX.find(wpMangaData)?.groupValues?.get(1)
+            ?: return null
+
+        val formBody = FormBody.Builder()
+            .add("action", "dynamic_view_ajax")
+            .add("post_id", postId)
+            .build()
+
+        val newHeaders = headersBuilder()
+            .set("Content-Length", formBody.contentLength().toString())
+            .set("Content-Type", formBody.contentType().toString())
+            .set("Referer", document.location())
+            .build()
+
+        return POST("$baseUrl/wp-admin/admin-ajax.php", newHeaders, formBody)
+    }
+
+    /**
+     * Send the view count request to the Madara endpoint.
+     *
+     * @param document The response document with the wp-manga data
+     */
+    protected open fun countViews(document: Document) {
+        if (!sendViewCount) {
+            return
+        }
+
+        val request = countViewsRequest(document) ?: return
+        runCatching { client.newCall(request).execute().close() }
+    }
+
+    // Filters
+    private class AuthorFilter : Filter.Text("Author")
+
+    private class YearFilter : Filter.Text("Year")
+
+    open class SelectFilter(
+        displayName: String,
+        vals: Array<Pair<String, String>>,
+        defaultValue: String? = null
+    ) : Filter.Select<String>(
+        displayName,
+        vals.map { it.first }.toTypedArray(),
+        vals.indexOfFirst { it.second == defaultValue }.takeIf { it != -1 } ?: 0
+    ) {
+        val selectedValue = vals[state].second
+    }
+
+    protected class StatusFilter : SelectFilter(
+        "Status",
+        arrayOf(
+            Pair("All", ""),
+            Pair("Ongoing", "ongoing"),
+            Pair("Completed", "completed"),
+            Pair("Hiatus", "hiatus"),
+            Pair("Dropped", "dropped")
+        )
+    )
+
+    protected class TypeFilter : SelectFilter(
+        "Type",
+        arrayOf(
+            Pair("All", ""),
+            Pair("Manga", "Manga"),
+            Pair("Manhwa", "Manhwa"),
+            Pair("Manhua", "Manhua"),
+            Pair("Comic", "Comic")
+        )
+    )
+
+    protected class OrderByFilter(defaultOrder: String? = null) : SelectFilter(
+        "Sort By",
+        arrayOf(
+            Pair("Default", ""),
+            Pair("A-Z", "title"),
+            Pair("Z-A", "titlereverse"),
+            Pair("Latest Update", "update"),
+            Pair("Latest Added", "latest"),
+            Pair("Popular", "popular")
+        ),
+        defaultOrder
+    )
+
+    protected class ProjectFilter : SelectFilter(
+        "Filter Project",
+        arrayOf(
+            Pair("Show all manga", ""),
+            Pair("Show only project manga", "project-filter-on")
+        )
+    )
+
+    protected class Genre(name: String, val value: String) : Filter.TriState(name)
+    protected class GenreListFilter(genres: List<Genre>) : Filter.Group<Genre>("Genre", genres)
+
+    private var genrelist: List<Genre>? = null
+    protected open fun getGenreList(): List<Genre> {
+        // Filters are fetched immediately once an extension loads
+        // We're only able to get filters after a loading the manga directory,
+        // and resetting the filters is the only thing that seems to reinflate the view
+        return genrelist ?: listOf(Genre("Press reset to attempt to fetch genres", ""))
+    }
+
+    open val hasProjectPage = false
+
+    override fun getFilterList(): FilterList {
+        val filters = mutableListOf<Filter<*>>(
+            Filter.Header("NOTE: Ignored if using text search!"),
+            Filter.Separator(),
+            AuthorFilter(),
+            YearFilter(),
+            StatusFilter(),
+            TypeFilter(),
+            OrderByFilter(),
+            Filter.Header("Genre exclusion is not available for all sources"),
+            GenreListFilter(getGenreList()),
+        )
+        if (hasProjectPage) {
+            filters.addAll(
+                mutableListOf<Filter<*>>(
+                    Filter.Separator(),
+                    Filter.Header("NOTE: Can't be used with other filter!"),
+                    Filter.Header("$name Project List page"),
+                    ProjectFilter(),
+                )
+            )
+        }
+        return FilterList(filters)
+    }
+
+    // Helpers
+    /**
+     * Given some string which represents an http urlString, returns path for a manga
+     * which can be used to fetch its details at "$baseUrl$mangaUrlDirectory/$mangaPath"
+     *
+     * @param urlString: String
+     *
+     * @returns Path of a manga, or null if none could be found
+     */
+    protected open fun mangaPathFromUrl(urlString: String): String? {
+        val baseMangaUrl = "$baseUrl$mangaUrlDirectory".toHttpUrl()
+        val url = urlString.toHttpUrlOrNull() ?: return null
+
+        val isMangaUrl = (baseMangaUrl.host == url.host && pathLengthIs(url, 2) && url.pathSegments[0] == baseMangaUrl.pathSegments[0])
+        if (isMangaUrl) return url.pathSegments[1]
+
+        val potentiallyChapterUrl = pathLengthIs(url, 1)
+        if (potentiallyChapterUrl) {
+            val response = client.newCall(GET(urlString, headers)).execute()
+            if (response.isSuccessful.not()) {
+                response.close()
+                throw IllegalStateException("HTTP error ${response.code}")
+            } else if (response.isSuccessful) {
+                val links = response.asJsoup().select("a[itemprop=item]")
+                //  near the top of page: home > manga > current chapter
+                if (links.size == 3) {
+                    return links[1].attr("href").toHttpUrlOrNull()?.encodedPath
+                }
+            }
+        }
+
+        return null
+    }
+
+    private fun pathLengthIs(url: HttpUrl, n: Int, strict: Boolean = false): Boolean {
+        return url.pathSegments.size == n && url.pathSegments[n - 1].isNotEmpty() ||
+            (!strict && url.pathSegments.size == n + 1 && url.pathSegments[n].isEmpty())
+    }
+
+    private fun parseGenres(document: Document): List<Genre>? {
+        return document.selectFirst("ul.genrez")?.select("li")?.map { li ->
+            Genre(
+                li.selectFirst("label").text(),
+                li.selectFirst("input[type=checkbox]").attr("value")
+            )
+        }
+    }
+
+    protected open fun Element.imgAttr(): String = if (this.hasAttr("data-src")) this.attr("abs:data-src") else this.attr("abs:src")
+    protected open fun Elements.imgAttr(): String = this.first().imgAttr()
+
+    // Unused
+    override fun popularMangaSelector(): String = throw UnsupportedOperationException("Not used")
+    override fun popularMangaFromElement(element: Element): SManga = throw UnsupportedOperationException("Not used")
+    override fun popularMangaNextPageSelector(): String? = throw UnsupportedOperationException("Not used")
+
+    override fun latestUpdatesSelector(): String = throw UnsupportedOperationException("Not used")
+    override fun latestUpdatesFromElement(element: Element): SManga = throw UnsupportedOperationException("Not used")
+    override fun latestUpdatesNextPageSelector(): String? = throw UnsupportedOperationException("Not used")
+
+    override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
+
+    companion object {
+        const val URL_SEARCH_PREFIX = "url:"
+
+        // More info: https://issuetracker.google.com/issues/36970498
+        @Suppress("RegExpRedundantEscape")
+        private val MANGA_PAGE_ID_REGEX = "post_id\\s*:\\s*(\\d+)\\}".toRegex()
+        private val CHAPTER_PAGE_ID_REGEX = "chapter_id\\s*=\\s*(\\d+);".toRegex()
+
+        val JSON_IMAGE_LIST_REGEX = "\"images\"\\s*:\\s*(\\[.*?])".toRegex()
+    }
+}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReaderGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt
similarity index 51%
rename from multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReaderGenerator.kt
rename to multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt
index 94a02a3d9..3b30ec98a 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReaderGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt
@@ -1,67 +1,108 @@
-package eu.kanade.tachiyomi.multisrc.wpmangareader
+package eu.kanade.tachiyomi.multisrc.mangathemesia
 
 import generator.ThemeSourceData.MultiLang
 import generator.ThemeSourceData.SingleLang
 import generator.ThemeSourceGenerator
 
-class WPMangaReaderGenerator : ThemeSourceGenerator {
+class MangaThemesiaGenerator : ThemeSourceGenerator {
 
-    override val themePkg = "wpmangareader"
+    override val themePkg = "mangathemesia"
 
-    override val themeClass = "WPMangaReader"
+    override val themeClass = "MangaThemesia"
 
-    override val baseVersionCode: Int = 14
+    override val baseVersionCode: Int = 16
 
     override val sources = listOf(
+        MultiLang("Asura Scans", "https://www.asurascans.com", listOf("en", "tr"), className = "AsuraScansFactory", pkgName = "asurascans", overrideVersionCode = 16),
         MultiLang("Flame Scans", "https://flamescans.org", listOf("ar", "en"), className = "FlameScansFactory", pkgName = "flamescans", overrideVersionCode = 1),
         SingleLang("Ace Scans", "https://acescans.xyz", "en", isNsfw = true, overrideVersionCode = 2),
         SingleLang("Alpha Scans", "https://alpha-scans.org", "en", overrideVersionCode = 1),
+        SingleLang("Animated Glitched Scans", "https://anigliscans.com", "en"),
         SingleLang("Arcane scan", "https://arcanescan.fr", "fr"),
+        SingleLang("ARESManga", "https://aresmanga.com", "ar", pkgName = "iimanga", overrideVersionCode = 2),
         SingleLang("Azure Scans", "https://azuremanga.com", "en", overrideVersionCode = 1),
         SingleLang("BeastScans", "https://beastscans.com", "en"),
+        SingleLang("Boosei", "https://boosei.com", "id", overrideVersionCode = 1),
         SingleLang("Franxx Mangás", "https://franxxmangas.net", "pt-BR", className = "FranxxMangas", isNsfw = true),
         SingleLang("Fusion Scanlation", "https://fusionscanlation.com", "es", className = "FusionScanlation", overrideVersionCode = 2),
         SingleLang("Gabut Scans", "https://gabutscans.com", "id", overrideVersionCode = 1),
         SingleLang("Gecenin Lordu", "https://geceninlordu.com", "tr", overrideVersionCode = 1),
+        SingleLang("GoGoManga", "https://gogomanga.fun", "en", overrideVersionCode = 1),
+        SingleLang("Imagine Scan", "https://imaginescan.com.br", "pt-BR", isNsfw = true, overrideVersionCode = 1),
+        SingleLang("Imperfect Comics", "https://imperfectcomic.com", "en", overrideVersionCode = 8),
         SingleLang("InariManga", "https://inarimanga.com", "es"),
+        SingleLang("Infernal Void Scans", "https://void-scans.com", "en", overrideVersionCode = 4),
+        SingleLang("Kanzenin", "https://kanzenin.xyz", "id", isNsfw = true),
         SingleLang("Kiryuu", "https://kiryuu.id", "id", overrideVersionCode = 6),
+        SingleLang("KlanKomik", "https://klankomik.com", "id", overrideVersionCode = 1),
+        SingleLang("Komik AV", "https://komikav.com", "id", overrideVersionCode = 1),
+        SingleLang("Komik Cast", "https://komikcast.me", "id", overrideVersionCode = 12),
         SingleLang("Komik Lab", "https://komiklab.com", "id"),
+        SingleLang("Komik Station", "https://komikstation.co", "id", overrideVersionCode = 3),
+        SingleLang("KomikIndo.co", "https://komikindo.co", "id", className = "KomikindoCo", overrideVersionCode = 3),
         SingleLang("KomikMama", "https://komikmama.co", "id", overrideVersionCode = 1),
+        SingleLang("Komiku.com", "https://komiku.com", "id", className = "KomikuCom"),
+        SingleLang("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en", className = "KumaScans", overrideVersionCode = 1),
         SingleLang("Legion Scan", "https://legionscans.com", "es"),
         SingleLang("Magus Manga", "https://magusmanga.com", "ar"),
-        SingleLang("MangKomik", "https://mangkomik.com", "id"),
+        SingleLang("Manga Pro", "https://mangaprotm.com", "ar", pkgName = "mangaproz", overrideVersionCode = 3),
+        SingleLang("Manga Raw.org", "https://mangaraw.org", "ja", className = "MangaRawOrg", overrideVersionCode = 1),
         SingleLang("MangaKita", "https://mangakita.net", "id", overrideVersionCode = 1),
+        SingleLang("Mangakyo", "https://www.mangakyo.me", "id"),
         SingleLang("Mangasusu", "https://mangasusu.co.in", "id", isNsfw = true, overrideVersionCode = 1),
+        SingleLang("MangaSwat", "https://swatmanga.co", "ar", overrideVersionCode = 7),
+        SingleLang("MangKomik", "https://mangkomik.com", "id"),
         SingleLang("Mangás Chan", "https://mangaschan.com", "pt-BR", className = "MangasChan"),
         SingleLang("Manhua Raw", "https://manhuaraw.com", "en"),
         SingleLang("ManhwaIndo", "https://manhwaindo.id", "id", isNsfw = true, overrideVersionCode = 2),
+        SingleLang("Manhwax", "https://manhwax.com", "en", isNsfw = true),
+        SingleLang("Mareceh", "https://mareceh.com", "id", isNsfw = true, pkgName = "mangceh", overrideVersionCode = 10),
         SingleLang("Martial Manga", "https://martialmanga.com", "es"),
+        SingleLang("MasterKomik", "https://masterkomik.com", "id", overrideVersionCode = 1),
         SingleLang("Miau Scan", "https://miauscan.com", "es"),
+        SingleLang("Mihentai", "https://mihentai.com", "all", isNsfw = true, overrideVersionCode = 1),
         SingleLang("Mode Scanlator", "https://modescanlator.com", "pt-BR", overrideVersionCode = 8),
         SingleLang("Ngomik", "https://ngomik.net", "id", overrideVersionCode = 1),
+        SingleLang("Non-Stop Scans", "https://www.nonstopscans.com", "en", className = "NonStopScans"),
+        SingleLang("NoxSubs", "https://noxsubs.com", "tr"),
+        SingleLang("Omega Scans", "https://omegascans.org", "en", isNsfw = true),
         SingleLang("Origami Orpheans", "https://origami-orpheans.com.br", "pt-BR", overrideVersionCode = 9),
         SingleLang("Ozul Scans", "https://ozulscans.com", "ar"),
-        SingleLang("PMScans", "http://www.rackusreader.org", "en", overrideVersionCode = 2),
         SingleLang("Patatescans", "https://patatescans.com", "fr", isNsfw = true, overrideVersionCode = 2),
+        SingleLang("Phantom Scans", "https://phantomscans.com", "en", overrideVersionCode = 1),
+        SingleLang("Phoenix Fansub", "https://phoenixfansub.com", "es", overrideVersionCode = 2),
+        SingleLang("PMScans", "http://www.rackusreader.org", "en", overrideVersionCode = 2),
+        SingleLang("Random Scans", "https://randomscans.xyz", "en"),
+        SingleLang("Rawkuma", "https://rawkuma.com/", "ja"),
+        SingleLang("Readkomik", "https://readkomik.com", "en", className = "ReadKomik", overrideVersionCode = 1),
         SingleLang("Realm Scans", "https://realmscans.com", "en", overrideVersionCode = 3),
         SingleLang("Sekaikomik", "https://www.sekaikomik.live", "id", isNsfw = true, overrideVersionCode = 9),
         SingleLang("Sekaikomik", "https://www.sekaikomik.site", "id", isNsfw = true, overrideVersionCode = 8),
+        SingleLang("Sekte Doujin", "https://sektedoujin.club", "id", isNsfw = true, overrideVersionCode = 3),
+        SingleLang("Sekte Komik", "https://sektekomik.com", "id", overrideVersionCode = 4),
+        SingleLang("Shadow Mangas", "https://shadowmangas.com", "es"),
+        SingleLang("Shea Manga", "https://sheakomik.com", "id", overrideVersionCode = 4),
         SingleLang("Shooting Star Scans", "https://shootingstarscans.com", "en", overrideVersionCode = 3),
         SingleLang("Silence Scan", "https://silencescan.com.br", "pt-BR", isNsfw = true, overrideVersionCode = 5),
         SingleLang("Skull Scans", "https://www.skullscans.com", "en", overrideVersionCode = 1),
-        SingleLang("Tsundoku Traduções", "https://tsundoku.com.br", "pt-BR", className = "TsundokuTraducoes", overrideVersionCode = 9),
-        SingleLang("TurkToon", "https://turktoon.com", "tr"),
-        SingleLang("World Romance Translation", "https://wrt.my.id", "id", overrideVersionCode = 10),
-        SingleLang("White Cloud Pavilion (New)", "https://www.whitecloudpavilion.com", "en", pkgName = "whitecloudpavilionnew", className = "WhiteCloudPavilion"),
-        SingleLang("ARESManga", "https://aresmanga.com", "ar", pkgName = "iimanga", overrideVersionCode = 2),
+        SingleLang("Snudae Scans", "https://snudaescans.com", "en", isNsfw = true, className = "BatotoScans", overrideVersionCode = 1),
+        SingleLang("Summer Fansub", "https://smmr.in", "pt-BR", isNsfw = true),
         SingleLang("Sushi-Scan", "https://sushiscan.su", "fr", className = "SushiScan"),
-        SingleLang("Komiku.com", "https://komiku.com", "id", className = "KomikuCom"),
+        SingleLang("Tempest Manga", "https://manga.tempestfansub.com", "tr"),
+        SingleLang("The Apollo Team", "https://theapollo.team", "en"),
+        SingleLang("Tsundoku Traduções", "https://tsundoku.com.br", "pt-BR", className = "TsundokuTraducoes", overrideVersionCode = 9),
+        SingleLang("TukangKomik", "https://tukangkomik.com", "id"),
+        SingleLang("TurkToon", "https://turktoon.com", "tr"),
+        SingleLang("West Manga", "https://westmanga.info", "id", overrideVersionCode = 1),
+        SingleLang("White Cloud Pavilion (New)", "https://www.whitecloudpavilion.com", "en", pkgName = "whitecloudpavilionnew", className = "WhiteCloudPavilion"),
+        SingleLang("World Romance Translation", "https://wrt.my.id", "id", overrideVersionCode = 10),
+        SingleLang("xCaliBR Scans", "https://xcalibrscans.com", "en", overrideVersionCode = 3),
     )
 
     companion object {
         @JvmStatic
         fun main(args: Array<String>) {
-            WPMangaReaderGenerator().createAll()
+            MangaThemesiaGenerator().createAll()
         }
     }
 }
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReaderUrlActivity.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaUrlActivity.kt
similarity index 72%
rename from multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReaderUrlActivity.kt
rename to multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaUrlActivity.kt
index b897b063c..6999ab7ae 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReaderUrlActivity.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaUrlActivity.kt
@@ -1,4 +1,4 @@
-package eu.kanade.tachiyomi.multisrc.wpmangareader
+package eu.kanade.tachiyomi.multisrc.mangathemesia
 
 import android.app.Activity
 import android.content.ActivityNotFoundException
@@ -7,7 +7,7 @@ import android.os.Bundle
 import android.util.Log
 import kotlin.system.exitProcess
 
-class WPMangaReaderUrlActivity : Activity() {
+class MangaThemesiaUrlActivity : Activity() {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -17,16 +17,16 @@ class WPMangaReaderUrlActivity : Activity() {
 
             val mainIntent = Intent().apply {
                 action = "eu.kanade.tachiyomi.SEARCH"
-                putExtra("query", "${WPMangaReader.URL_SEARCH_PREFIX}${intent?.data?.toString()}")
+                putExtra("query", "${MangaThemesia.URL_SEARCH_PREFIX}${intent?.data?.toString()}")
                 putExtra("filter", packageName)
             }
             try {
                 startActivity(mainIntent)
             } catch (e: ActivityNotFoundException) {
-                Log.e("WPMangaReaderUrl", e.toString())
+                Log.e("MangaThemesiaUrlActivity", e.toString())
             }
         } else {
-            Log.e("WPMangaReaderUrl", "could not parse uri from intent $intent")
+            Log.e("MangaThemesiaUrlActivity", "Could not parse uri from intent $intent")
         }
 
         finish()
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/README.md b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/README.md
new file mode 100644
index 000000000..37dfb2e07
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/README.md
@@ -0,0 +1 @@
+MangaThemesia is WPMangaReader and WPMangaStream merged together as they both had similar code. Both theme was made by [Themesia Studios](https://themesia.com)
\ No newline at end of file
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReader.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReader.kt
deleted file mode 100644
index f20ab2bef..000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangareader/WPMangaReader.kt
+++ /dev/null
@@ -1,431 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.wpmangareader
-
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.POST
-import eu.kanade.tachiyomi.network.asObservableSuccess
-import eu.kanade.tachiyomi.source.model.Filter
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.MangasPage
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.ParsedHttpSource
-import eu.kanade.tachiyomi.util.asJsoup
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.FormBody
-import okhttp3.HttpUrl
-import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import rx.Observable
-import rx.Single
-import uy.kohesive.injekt.injectLazy
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-abstract class WPMangaReader(
-    override val name: String,
-    override val baseUrl: String,
-    override val lang: String,
-    val mangaUrlDirectory: String = "/manga",
-    private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US)
-) : ParsedHttpSource() {
-
-    override val supportsLatest = true
-
-    override val client: OkHttpClient = network.cloudflareClient
-
-    protected val json: Json by injectLazy()
-
-    // popular
-    override fun popularMangaRequest(page: Int) = searchMangaRequest(page, "", FilterList(OrderByFilter(5)))
-    override fun popularMangaParse(response: Response) = searchMangaParse(response)
-
-    override fun popularMangaFromElement(element: Element) = throw UnsupportedOperationException("Not used")
-    override fun popularMangaSelector() = throw UnsupportedOperationException("Not used")
-    override fun popularMangaNextPageSelector() = throw UnsupportedOperationException("Not used")
-
-    // latest
-    override fun latestUpdatesRequest(page: Int) = searchMangaRequest(page, "", FilterList(OrderByFilter(3)))
-    override fun latestUpdatesParse(response: Response) = searchMangaParse(response)
-
-    override fun latestUpdatesSelector() = throw UnsupportedOperationException("Not used")
-    override fun latestUpdatesFromElement(element: Element) = throw UnsupportedOperationException("Not used")
-    override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException("Not used")
-
-    // search
-    override fun searchMangaSelector() = ".utao .uta .imgu, .listupd .bs .bsx, .listo .bs .bsx"
-
-    /**
-     * Given some string which represents an http url, returns a identifier (id) for a manga
-     * which can be used to fetch its details at "$baseUrl$mangaUrlDirectory/$id"
-     *
-     * @param s: String - url
-     *
-     * @returns An identifier for a manga, or null if none could be found
-     */
-    protected open fun mangaIdFromUrl(s: String): Single<String?> {
-        val baseMangaUrl = "$baseUrl$mangaUrlDirectory".toHttpUrlOrNull()!!
-        return s.toHttpUrlOrNull()?.let { url ->
-            fun pathLengthIs(url: HttpUrl, n: Int, strict: Boolean = false) = url.pathSegments.size == n && url.pathSegments[n - 1].isNotEmpty() || (!strict && url.pathSegments.size == n + 1 && url.pathSegments[n].isEmpty())
-            val isMangaUrl = listOf(
-                baseMangaUrl.host == url.host,
-                pathLengthIs(url, 2),
-                url.pathSegments[0] == baseMangaUrl.pathSegments[0]
-            ).all { it }
-            val potentiallyChapterUrl = pathLengthIs(url, 1)
-            if (isMangaUrl)
-                Single.just(url.pathSegments[1])
-            else if (potentiallyChapterUrl)
-                client.newCall(GET(s, headers)).asObservableSuccess().map {
-                    val links = it.asJsoup().select("a[itemprop=item]")
-                    if (links.size == 3) //  near the top of page: home > manga > current chapter
-                        links[1].attr("href").toHttpUrlOrNull()?.pathSegments?.get(1)
-                    else
-                        null
-                }.toSingle()
-            else
-                Single.just(null)
-        } ?: Single.just(null)
-    }
-
-    override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
-        if (!query.startsWith(URL_SEARCH_PREFIX))
-            return super.fetchSearchManga(page, query, filters)
-
-        return mangaIdFromUrl(query.substringAfter(URL_SEARCH_PREFIX))
-            .toObservable()
-            .concatMap { id ->
-                if (id == null)
-                    Observable.just(MangasPage(emptyList(), false))
-                else
-                    fetchMangaDetails(SManga.create().apply { this.url = "$mangaUrlDirectory/$id" })
-                        .map {
-                            it.url = "$mangaUrlDirectory/$id" // isn't set in returned manga
-                            MangasPage(listOf(it), false)
-                        }
-            }
-    }
-
-    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
-        var url = "$baseUrl".toHttpUrlOrNull()!!.newBuilder()
-        if (query.isNotEmpty()) {
-            url.addPathSegments("page/$page").addQueryParameter("s", query)
-        } else {
-            url.addPathSegment(mangaUrlDirectory.substring(1)).addQueryParameter("page", "$page")
-            filters.forEach { filter ->
-                when (filter) {
-                    is UrlEncoded -> filter.encode(url)
-                    // if site has project page, default value "hasProjectPage" = false
-                    is ProjectFilter -> {
-                        if (filter.toUriPart() == "project-filter-on") {
-                            url = "$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder()
-                        }
-                    }
-                }
-            }
-        }
-        return GET("$url")
-    }
-
-    open val projectPageString = "/project"
-
-    override fun searchMangaParse(response: Response): MangasPage {
-        if (genrelist == null)
-            genrelist = parseGenres(response.asJsoup(response.peekBody(Long.MAX_VALUE).string()))
-        return super.searchMangaParse(response)
-    }
-
-    private fun parseGenres(document: Document): List<LabeledValue>? {
-        return document.selectFirst("ul.c4")?.select("li")?.map { li ->
-            LabeledValue(li.selectFirst("label").text(), li.selectFirst("input[type=checkbox]").`val`())
-        }
-    }
-
-    override fun searchMangaFromElement(element: Element) = SManga.create().apply {
-        thumbnail_url = element.select("img").attr("abs:src")
-        title = element.select("a").attr("title")
-        setUrlWithoutDomain(element.select("a").attr("href"))
-    }
-
-    override fun searchMangaNextPageSelector() = "div.pagination .next, div.hpage .r"
-
-    // manga details
-    override fun mangaDetailsParse(document: Document) = SManga.create().apply {
-        author = document.select(seriesAuthorSelector).firstOrNull()?.ownText()
-        artist = document.select(seriesArtistSelector).firstOrNull()?.ownText()
-        genre = document.select(seriesGenreSelector).joinToString { it.text() }
-        status = parseStatus(document.select(seriesStatusSelector).text())
-        title = document.selectFirst(seriesTitleSelector).text()
-        thumbnail_url = document.select(seriesThumbnailSelector).attr("abs:src")
-        description = document.select(seriesDescriptionSelector).joinToString("\n") { it.text() }
-
-        // add series type(manga/manhwa/manhua/other) thinggy to genre
-        document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-            if (it.isEmpty().not() && genre!!.contains(it, true).not()) {
-                genre += if (genre!!.isEmpty()) it else ", $it"
-            }
-        }
-
-        // add alternative name to manga description
-        document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-            if (it.isEmpty().not()) {
-                description += when {
-                    description!!.isEmpty() -> altName + it
-                    else -> "\n\n$altName" + it
-                }
-            }
-        }
-    }
-
-    open val seriesAuthorSelector = ".listinfo li:contains(Author), .tsinfo .imptdt:nth-child(4) i, .infotable tr:contains(author) td:last-child"
-    open val seriesArtistSelector = ".infotable tr:contains(artist) td:last-child, .tsinfo .imptdt:contains(artist) i"
-    open val seriesGenreSelector = "div.gnr a, .mgen a, .seriestugenre a"
-    open val seriesStatusSelector = "div.listinfo li:contains(Status), .tsinfo .imptdt:contains(status), .tsinfo .imptdt:contains(الحالة), .infotable tr:contains(status) td"
-    open val seriesTitleSelector = "h1.entry-title"
-    open val seriesThumbnailSelector = ".infomanga > div[itemprop=image] img, .thumb img"
-    open val seriesDescriptionSelector = ".desc, .entry-content[itemprop=description]"
-    open val seriesTypeSelector = "span:contains(Type) a, .imptdt:contains(Type) :last-child, a[href*=type\\=], .infotable tr:contains(Type) td:last-child"
-    open val altNameSelector = ".alternative, .seriestualt"
-    open val altName = "Alternative Name" + ": "
-
-    open fun parseStatus(status: String) = when {
-        status.contains("Ongoing") -> SManga.ONGOING
-        status.contains("Completed") -> SManga.COMPLETED
-        else -> SManga.UNKNOWN
-    }
-
-    // chapters
-    override fun chapterListSelector() = "div.bxcl li, #chapterlist li .eph-num a"
-
-    override fun chapterListParse(response: Response): List<SChapter> {
-        val document = response.asJsoup()
-        val chapters = document.select(chapterListSelector()).map { chapterFromElement(it) }
-
-        // Add timestamp to latest chapter, taken from "Updated On". so source which not provide chapter timestamp will have atleast one
-        val date = document.select(".listinfo time[itemprop=dateModified]").attr("datetime")
-        val checkChapter = document.select(chapterListSelector()).firstOrNull()
-        if (date != "" && checkChapter != null) chapters[0].date_upload = parseDate(date)
-
-        countViews(document)
-
-        return chapters
-    }
-
-    private fun parseChapterDate(date: String): Long {
-        return try {
-            dateFormat.parse(date)?.time ?: 0
-        } catch (_: Exception) {
-            0L
-        }
-    }
-
-    private fun parseDate(date: String): Long {
-        return SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(date)?.time ?: 0L
-    }
-
-    override fun chapterFromElement(element: Element) = SChapter.create().apply {
-        setUrlWithoutDomain(element.select("a").attr("href").substringAfter(baseUrl))
-        name = element.select(".lch a, .chapternum").text()
-        date_upload = element.select(".chapterdate").firstOrNull()?.text()?.let { parseChapterDate(it) } ?: 0
-    }
-
-    // pages
-    open val pageSelector = "div#readerarea img"
-
-    override fun pageListParse(document: Document): List<Page> {
-        val pages = mutableListOf<Page>()
-        document.select(pageSelector)
-            .filterNot { it.attr("abs:src").isNullOrEmpty() }
-            .mapIndexed { i, img -> pages.add(Page(i, "", img.attr("abs:src"))) }
-
-        countViews(document)
-
-        // Some sites like Mangakita, MangKomik now load pages via javascript
-        if (pages.isNotEmpty()) { return pages }
-
-        val docString = document.toString()
-        val imageListRegex = Regex("\\\"images\\\"\\s*:\\s*(\\[.*?\\])")
-        val imageListJson = imageListRegex.find(docString)!!.destructured.toList()[0]
-
-        val imageList = json.parseToJsonElement(imageListJson).jsonArray
-
-        pages += imageList.mapIndexed { i, jsonEl ->
-            Page(i, "", jsonEl.jsonPrimitive.content)
-        }
-
-        return pages
-    }
-
-    override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
-
-    /**
-     * Set it to false if you want to disable the extension reporting the view count
-     * back to the source website through admin-ajax.php.
-     */
-    protected open val sendViewCount: Boolean = true
-
-    protected open fun countViewsRequest(document: Document): Request? {
-        val wpMangaData = document.select("script:containsData(dynamic_view_ajax)").firstOrNull()
-            ?.data() ?: return null
-
-        val postId = CHAPTER_PAGE_ID_REGEX.find(wpMangaData)?.groupValues?.get(1)
-            ?: MANGA_PAGE_ID_REGEX.find(wpMangaData)?.groupValues?.get(1)
-            ?: return null
-
-        val formBody = FormBody.Builder()
-            .add("action", "dynamic_view_ajax")
-            .add("post_id", postId)
-            .build()
-
-        val newHeaders = headersBuilder()
-            .set("Content-Length", formBody.contentLength().toString())
-            .set("Content-Type", formBody.contentType().toString())
-            .set("Referer", document.location())
-            .build()
-
-        return POST("$baseUrl/wp-admin/admin-ajax.php", newHeaders, formBody)
-    }
-
-    /**
-     * Send the view count request to the Madara endpoint.
-     *
-     * @param document The response document with the wp-manga data
-     */
-    protected open fun countViews(document: Document) {
-        if (!sendViewCount) {
-            return
-        }
-
-        val request = countViewsRequest(document) ?: return
-        runCatching { client.newCall(request).execute().close() }
-    }
-
-    private interface UrlEncoded {
-        fun encode(url: HttpUrl.Builder)
-    }
-
-    // essentially a named pair
-    protected class LabeledValue(val displayname: String, val _value: String?) {
-        val value: String get() = _value ?: displayname
-        override fun toString(): String = displayname
-    }
-
-    private open class Select<T>(header: String, values: Array<T>, state: Int = 0) : Filter.Select<T>(header, values, state) {
-        val selected: T
-            get() = this.values[this.state]
-    }
-
-    private open class MultiSelect<T>(header: String, val elems: List<T>) :
-        Filter.Group<Filter.CheckBox>(header, elems.map { object : Filter.CheckBox("$it") {} }) {
-        val selected: Sequence<T>
-            get() = this.elems.asSequence().filterIndexed { i, _ -> this.state[i].state }
-    }
-
-    open val hasProjectPage = false
-
-    // filters
-    override fun getFilterList(): FilterList {
-        val filters = mutableListOf<Filter<*>>(
-            Filter.Header("NOTE: Ignored if using text search!"),
-            GenreFilter(),
-            StatusFilter(),
-            TypesFilter(),
-            OrderByFilter(),
-        )
-        if (hasProjectPage) {
-            filters.addAll(
-                mutableListOf<Filter<*>>(
-                    Filter.Separator(),
-                    Filter.Header("NOTE: cant be used with other filter!"),
-                    Filter.Header("$name Project List page"),
-                    ProjectFilter(),
-                )
-            )
-        }
-        return FilterList(filters)
-    }
-
-    protected class ProjectFilter : UriPartFilter(
-        "Filter Project",
-        arrayOf(
-            Pair("Show all manga", ""),
-            Pair("Show only project manga", "project-filter-on")
-        )
-    )
-
-    open class UriPartFilter(displayName: String, private val vals: Array<Pair<String, String>>) :
-        Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
-        fun toUriPart() = vals[state].second
-    }
-
-    private fun GenreFilter() = object : MultiSelect<LabeledValue>("Genre", getGenreList()), UrlEncoded {
-        override fun encode(url: HttpUrl.Builder) {
-            selected.forEach { url.addQueryParameter("genre[]", it.value) }
-        }
-    }
-
-    private fun StatusFilter() = object : Select<LabeledValue>("Status", getPublicationStatus()), UrlEncoded {
-        override fun encode(url: HttpUrl.Builder) {
-            url.addQueryParameter("status", selected.value)
-        }
-    }
-
-    private fun TypesFilter() = object : Select<LabeledValue>("Type", getContentType()), UrlEncoded {
-        override fun encode(url: HttpUrl.Builder) {
-            url.addQueryParameter("type", selected.value)
-        }
-    }
-
-    private fun OrderByFilter(state: Int = 0) = object : Select<LabeledValue>("Order By", getOrderBy(), state), UrlEncoded {
-        override fun encode(url: HttpUrl.Builder) {
-            url.addQueryParameter("order", selected.value)
-        }
-    }
-
-    // overridable
-    // some sources have numeric values for filters
-    private var genrelist: List<LabeledValue>? = null
-    protected open fun getGenreList(): List<LabeledValue> {
-        // Filters are fetched immediately once an extension loads
-        // We're only able to get filters after a loading the manga directory, and resetting
-        // the filters is the only thing that seems to reinflate the view
-        return genrelist ?: listOf(LabeledValue("Press reset to attempt to fetch genres", ""))
-    }
-
-    private fun getPublicationStatus() = arrayOf(
-        LabeledValue("All", ""),
-        LabeledValue("Ongoing", "ongoing"),
-        LabeledValue("Completed", "completed"),
-        LabeledValue("Hiatus", "hiatus")
-    )
-
-    private fun getContentType() = arrayOf(
-        LabeledValue("All", ""),
-        LabeledValue("Manga", "manga"),
-        LabeledValue("Manhwa", "manhwa"),
-        LabeledValue("Manhua", "manhua"),
-        LabeledValue("Comic", "comic")
-    )
-
-    private fun getOrderBy() = arrayOf(
-        LabeledValue("Default", ""),
-        LabeledValue("A-Z", "title"),
-        LabeledValue("Z-A", "titlereverse"),
-        LabeledValue("Update", "update"),
-        LabeledValue("Added", "latest"),
-        LabeledValue("Popular", "popular")
-    )
-
-    companion object {
-        const val URL_SEARCH_PREFIX = "url:"
-
-        private val MANGA_PAGE_ID_REGEX = "post_id\\s*:\\s*(\\d+)\\}".toRegex()
-        private val CHAPTER_PAGE_ID_REGEX = "post_id\\s*=\\s*(\\d+);?".toRegex()
-    }
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStream.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStream.kt
deleted file mode 100644
index b302688a0..000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStream.kt
+++ /dev/null
@@ -1,607 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.wpmangastream
-
-import android.app.Application
-import android.content.SharedPreferences
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.POST
-import eu.kanade.tachiyomi.network.asObservableSuccess
-import eu.kanade.tachiyomi.source.ConfigurableSource
-import eu.kanade.tachiyomi.source.model.Filter
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.MangasPage
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.ParsedHttpSource
-import eu.kanade.tachiyomi.util.asJsoup
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.FormBody
-import okhttp3.Headers
-import okhttp3.HttpUrl
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import org.jsoup.select.Elements
-import rx.Observable
-import rx.Single
-import uy.kohesive.injekt.Injekt
-import uy.kohesive.injekt.api.get
-import uy.kohesive.injekt.injectLazy
-import java.text.SimpleDateFormat
-import java.util.Calendar
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-abstract class WPMangaStream(
-    override val name: String,
-    override val baseUrl: String,
-    override val lang: String,
-    private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMM d, yyyy", Locale.US)
-) : ConfigurableSource, ParsedHttpSource() {
-    override val supportsLatest = true
-
-    private val preferences: SharedPreferences by lazy {
-        Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
-    }
-
-    override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
-        val thumbsPref = androidx.preference.ListPreference(screen.context).apply {
-            key = SHOW_THUMBNAIL_PREF_Title
-            title = SHOW_THUMBNAIL_PREF_Title
-            entries = arrayOf("Show high quality", "Show mid quality", "Show low quality")
-            entryValues = arrayOf("0", "1", "2")
-            summary = "%s"
-
-            setOnPreferenceChangeListener { _, newValue ->
-                val selected = newValue as String
-                val index = this.findIndexOfValue(selected)
-                preferences.edit().putInt(SHOW_THUMBNAIL_PREF, index).commit()
-            }
-        }
-        screen.addPreference(thumbsPref)
-    }
-
-    private fun getShowThumbnail(): Int = preferences.getInt(SHOW_THUMBNAIL_PREF, 0)
-
-    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
-        .connectTimeout(10, TimeUnit.SECONDS)
-        .readTimeout(30, TimeUnit.SECONDS)
-        .build()
-
-    protected fun Element.imgAttr(): String = if (this.hasAttr("data-src")) this.attr("abs:data-src") else this.attr("abs:src")
-    protected fun Elements.imgAttr(): String = this.first().imgAttr()
-
-    private val json: Json by injectLazy()
-
-    override fun popularMangaRequest(page: Int): Request {
-        return GET("$baseUrl/manga/?page=$page&order=popular", headers)
-    }
-
-    override fun latestUpdatesRequest(page: Int): Request {
-        return GET("$baseUrl/manga/?page=$page&order=update", headers)
-    }
-
-    /**
-     * Given some string which represents an http url, returns the URI path to the corresponding series
-     * if the original pointed to either a series or a chapter
-     *
-     * @param s: String - url
-     *
-     * @returns URI path or null
-     */
-    protected open fun mangaPathFromUrl(s: String): Single<String?> {
-        val baseMangaUrl = baseUrl.toHttpUrlOrNull()!!
-        // Would be dope if wpmangastream had a mangaUrlDirectory like wpmangareader
-        val mangaDirectories = listOf("manga", "comics", "komik")
-        return s.toHttpUrlOrNull()?.let { url ->
-            fun pathLengthIs(url: HttpUrl, n: Int, strict: Boolean = false) = url.pathSegments.size == n && url.pathSegments[n - 1].isNotEmpty() || (!strict && url.pathSegments.size == n + 1 && url.pathSegments[n].isEmpty())
-            val potentiallyChapterUrl = pathLengthIs(url, 1)
-            val isMangaUrl = listOf(
-                baseMangaUrl.topPrivateDomain() == url.topPrivateDomain(),
-                pathLengthIs(url, 2),
-                url.pathSegments[0] in mangaDirectories
-            ).all { it }
-            if (isMangaUrl)
-                Single.just(url.encodedPath)
-            else if (potentiallyChapterUrl)
-                client.newCall(GET(s, headers)).asObservableSuccess().map {
-                    val links = it.asJsoup().select("a[itemprop=item]")
-                    if (links.size == 3) //  near the top of page: home > manga > current chapter
-                        links[1].attr("href").toHttpUrlOrNull()?.encodedPath
-                    else
-                        null
-                }.toSingle()
-            else
-                Single.just(null)
-        } ?: Single.just(null)
-    }
-
-    override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
-        if (!query.startsWith(URL_SEARCH_PREFIX))
-            return super.fetchSearchManga(page, query, filters)
-
-        return mangaPathFromUrl(query.substringAfter(URL_SEARCH_PREFIX))
-            .toObservable()
-            .concatMap { path ->
-                if (path == null)
-                    Observable.just(MangasPage(emptyList(), false))
-                else
-                    fetchMangaDetails(SManga.create().apply { this.url = path })
-                        .map {
-                            it.url = path // isn't set in returned manga
-                            MangasPage(listOf(it), false)
-                        }
-            }
-    }
-
-    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
-        var url = "$baseUrl/manga/".toHttpUrlOrNull()!!.newBuilder()
-        url.addQueryParameter("title", query)
-        url.addQueryParameter("page", page.toString())
-        filters.forEach { filter ->
-            when (filter) {
-                is AuthorFilter -> {
-                    url.addQueryParameter("author", filter.state)
-                }
-                is YearFilter -> {
-                    url.addQueryParameter("yearx", filter.state)
-                }
-                is StatusFilter -> {
-                    url.addQueryParameter("status", filter.toUriPart())
-                }
-                is TypeFilter -> {
-                    url.addQueryParameter("type", filter.toUriPart())
-                }
-                is SortByFilter -> {
-                    url.addQueryParameter("order", filter.toUriPart())
-                }
-                is GenreListFilter -> {
-                    filter.state
-                        .filter { it.state != Filter.TriState.STATE_IGNORE }
-                        .forEach { url.addQueryParameter("genre[]", it.id) }
-                }
-                // if site has project page, default value "hasProjectPage" = false
-                is ProjectFilter -> {
-                    if (filter.toUriPart() == "project-filter-on") {
-                        url = "$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder()
-                    }
-                }
-            }
-        }
-        return GET(url.build().toString(), headers)
-    }
-
-    open val projectPageString = "/project"
-
-    override fun popularMangaSelector() = "div.bs"
-    override fun latestUpdatesSelector() = popularMangaSelector()
-    override fun searchMangaSelector() = popularMangaSelector()
-
-    override fun popularMangaFromElement(element: Element): SManga {
-        val manga = SManga.create()
-        manga.thumbnail_url = element.select("div.limit img").imgAttr()
-        element.select("div.bsx > a").first().let {
-            manga.setUrlWithoutDomain(it.attr("href"))
-            manga.title = it.attr("title")
-        }
-        return manga
-    }
-
-    override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element)
-    override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
-
-    override fun popularMangaNextPageSelector(): String? = "a.next.page-numbers, a.r"
-    override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
-    override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
-
-    override fun mangaDetailsParse(document: Document): SManga {
-        return SManga.create().apply {
-            document.select("div.bigcontent, div.animefull, div.main-info").firstOrNull()?.let { infoElement ->
-                status = parseStatus(infoElement.select(mangaDetailsSelectorStatus).firstOrNull()?.ownText())
-                author = isEmptyPlaceholder(infoElement.select(mangaDetailsSelectorAuthor).firstOrNull()?.ownText())
-                artist = isEmptyPlaceholder(infoElement.select(mangaDetailsSelectorArtist).firstOrNull()?.ownText())
-                description = infoElement.select(mangaDetailsSelectorDescription).joinToString("\n") { it.text() }
-                thumbnail_url = infoElement.select(mangaDetailsSelectorThumbnail).imgAttr()
-
-                val genres = infoElement.select(mangaDetailsSelectorGenre)
-                    .map { element -> element.text().lowercase() }
-                    .toMutableSet()
-
-                // add series type(manga/manhwa/manhua/other) thinggy to genre
-                document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isEmpty().not() && genres.contains(it).not()) {
-                        genres.add(it.lowercase())
-                    }
-                }
-
-                genre = genres.toList().map { it.capitalize() }.joinToString(", ")
-
-                // add alternative name to manga description
-                document.select(altNameSelector).firstOrNull()?.ownText()?.let {
-                    if (it.isBlank().not() && it != "N/A" && it != "-") {
-                        description = when {
-                            description.isNullOrBlank() -> altName + it
-                            else -> description + "\n\n$altName" + it
-                        }
-                    }
-                }
-            }
-        }
-    }
-    // Manga Details Selector
-    open val mangaDetailsSelectorAuthor = "span:contains(Author:), span:contains(Pengarang:), .fmed b:contains(Author)+span, .imptdt:contains(Author) i"
-    open val mangaDetailsSelectorArtist = ".fmed b:contains(Artist)+span, .imptdt:contains(Artist) i"
-    open val mangaDetailsSelectorStatus = "span:contains(Status:), .imptdt:contains(Status) i"
-    open val mangaDetailsSelectorDescription = "div.desc p, div.entry-content p"
-    open val mangaDetailsSelectorThumbnail = "div.thumb img"
-    open val mangaDetailsSelectorGenre = "span:contains(Genre) a, .mgen a"
-
-    open val seriesTypeSelector = "span:contains(Type) a, .imptdt:contains(Type) a, a[href*=type\\=], .infotable tr:contains(Type) td:last-child"
-    open val altNameSelector = ".alternative, .wd-full:contains(Alt) span, .alter, .seriestualt"
-    open val altName = "Alternative Name" + ": "
-
-    protected open fun parseStatus(element: String?): Int = when {
-        element == null -> SManga.UNKNOWN
-        listOf("ongoing", "publishing").any { it.contains(element, ignoreCase = true) } -> SManga.ONGOING
-        listOf("completed").any { it.contains(element, ignoreCase = true) } -> SManga.COMPLETED
-        else -> SManga.UNKNOWN
-    }
-
-    private fun isEmptyPlaceholder(string: String?): String? {
-        return if (string == "-" || string == "N/A") "" else string
-    }
-
-    override fun chapterListSelector() = "div.bxcl ul li, div.cl ul li, ul li:has(div.chbox):has(div.eph-num)"
-
-    override fun chapterListParse(response: Response): List<SChapter> {
-        val document = response.asJsoup()
-        val chapters = document.select(chapterListSelector()).map { chapterFromElement(it) }
-
-        // Add timestamp to latest chapter, taken from "Updated On". so source which not provide chapter timestamp will have atleast one
-        val date = document.select(".fmed:contains(update) time ,span:contains(update) time").attr("datetime")
-        val checkChapter = document.select(chapterListSelector()).firstOrNull()
-        if (date != "" && checkChapter != null) chapters[0].date_upload = parseDate(date)
-
-        countViews(document)
-
-        return chapters
-    }
-
-    private fun parseDate(date: String): Long {
-        return SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(date)?.time ?: 0L
-    }
-
-    override fun chapterFromElement(element: Element): SChapter {
-        val urlElement = element.select(".lchx > a, span.leftoff a, div.eph-num > a").first()
-        val chapter = SChapter.create()
-        chapter.setUrlWithoutDomain(urlElement.attr("href"))
-        chapter.name = if (urlElement.select("span.chapternum").isNotEmpty()) urlElement.select("span.chapternum").text() else urlElement.text()
-        chapter.date_upload = element.select("span.rightoff, time, span.chapterdate").firstOrNull()?.text()?.let { parseChapterDate(it) }
-            ?: 0
-        return chapter
-    }
-
-    fun parseChapterDate(date: String): Long {
-        return if (date.endsWith("ago")) {
-            val value = date.split(' ')[0].toInt()
-            when {
-                "min" in date -> Calendar.getInstance().apply {
-                    add(Calendar.MINUTE, value * -1)
-                }.timeInMillis
-                "hour" in date -> Calendar.getInstance().apply {
-                    add(Calendar.HOUR_OF_DAY, value * -1)
-                }.timeInMillis
-                "day" in date -> Calendar.getInstance().apply {
-                    add(Calendar.DATE, value * -1)
-                }.timeInMillis
-                "week" in date -> Calendar.getInstance().apply {
-                    add(Calendar.DATE, value * 7 * -1)
-                }.timeInMillis
-                "month" in date -> Calendar.getInstance().apply {
-                    add(Calendar.MONTH, value * -1)
-                }.timeInMillis
-                "year" in date -> Calendar.getInstance().apply {
-                    add(Calendar.YEAR, value * -1)
-                }.timeInMillis
-                else -> {
-                    0L
-                }
-            }
-        } else {
-            try {
-                dateFormat.parse(date)?.time ?: 0
-            } catch (_: Exception) {
-                0L
-            }
-        }
-    }
-
-    override fun prepareNewChapter(chapter: SChapter, manga: SManga) {
-        val basic = Regex("""Chapter\s([0-9]+)""")
-        when {
-            basic.containsMatchIn(chapter.name) -> {
-                basic.find(chapter.name)?.let {
-                    chapter.chapter_number = it.groups[1]?.value!!.toFloat()
-                }
-            }
-        }
-    }
-
-    open val pageSelector = "div#readerarea img"
-
-    override fun pageListParse(document: Document): List<Page> {
-        val htmlPages = document.select(pageSelector)
-            .filterNot { it.attr("abs:src").isNullOrEmpty() }
-            .mapIndexed { i, img -> Page(i, "", img.attr("abs:src")) }
-            .toMutableList()
-
-        val docString = document.toString()
-        val imageListRegex = Regex("\\\"images.*?:.*?(\\[.*?\\])")
-        val imageListJson = imageListRegex.find(docString)!!.destructured.toList()[0]
-
-        val imageList = json.parseToJsonElement(imageListJson).jsonArray
-        val baseResolver = baseUrl.toHttpUrl()
-
-        val scriptPages = imageList.mapIndexed { i, jsonEl ->
-            val imageUrl = jsonEl.jsonPrimitive.content
-            Page(i, "", baseResolver.resolve(imageUrl).toString())
-        }
-
-        if (htmlPages.size < scriptPages.size) {
-            htmlPages += scriptPages
-        }
-
-        countViews(document)
-
-        return htmlPages.distinctBy { it.imageUrl }
-    }
-
-    override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")
-
-    override fun imageRequest(page: Page): Request {
-        val headers = Headers.Builder()
-        headers.apply {
-            add("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
-            add("Referer", baseUrl)
-            add("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.100 Mobile Safari/537.36")
-        }
-
-        if (page.imageUrl!!.contains(".wp.com")) {
-            headers.apply {
-                set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
-            }
-        }
-
-        return GET(getImageUrl(page.imageUrl!!, getShowThumbnail()), headers.build())
-    }
-
-    private fun getImageUrl(originalUrl: String, quality: Int): String {
-        val url = originalUrl.substringAfter("//")
-        return when (quality) {
-            LOW_QUALITY -> "https://images.weserv.nl/?w=300&q=70&url=$url"
-            MID_QUALITY -> "https://images.weserv.nl/?w=600&q=70&url=$url"
-            else -> originalUrl
-        }
-    }
-
-    /**
-     * Set it to false if you want to disable the extension reporting the view count
-     * back to the source website through admin-ajax.php.
-     */
-    protected open val sendViewCount: Boolean = true
-
-    protected open fun countViewsRequest(document: Document): Request? {
-        val wpMangaData = document.select("script:containsData(dynamic_view_ajax)").firstOrNull()
-            ?.data() ?: return null
-
-        val postId = CHAPTER_PAGE_ID_REGEX.find(wpMangaData)?.groupValues?.get(1)
-            ?: MANGA_PAGE_ID_REGEX.find(wpMangaData)?.groupValues?.get(1)
-            ?: return null
-
-        val formBody = FormBody.Builder()
-            .add("action", "dynamic_view_ajax")
-            .add("post_id", postId)
-            .build()
-
-        val newHeaders = headersBuilder()
-            .set("Content-Length", formBody.contentLength().toString())
-            .set("Content-Type", formBody.contentType().toString())
-            .set("Referer", document.location())
-            .build()
-
-        return POST("$baseUrl/wp-admin/admin-ajax.php", newHeaders, formBody)
-    }
-
-    /**
-     * Send the view count request to the Madara endpoint.
-     *
-     * @param document The response document with the wp-manga data
-     */
-    protected open fun countViews(document: Document) {
-        if (!sendViewCount) {
-            return
-        }
-
-        val request = countViewsRequest(document) ?: return
-        runCatching { client.newCall(request).execute().close() }
-    }
-
-    private class AuthorFilter : Filter.Text("Author")
-
-    private class YearFilter : Filter.Text("Year")
-
-    protected class TypeFilter : UriPartFilter(
-        "Type",
-        arrayOf(
-            Pair("Default", ""),
-            Pair("Manga", "Manga"),
-            Pair("Manhwa", "Manhwa"),
-            Pair("Manhua", "Manhua"),
-            Pair("Comic", "Comic")
-        )
-    )
-
-    protected class SortByFilter : UriPartFilter(
-        "Sort By",
-        arrayOf(
-            Pair("Default", ""),
-            Pair("A-Z", "title"),
-            Pair("Z-A", "titlereverse"),
-            Pair("Latest Update", "update"),
-            Pair("Latest Added", "latest"),
-            Pair("Popular", "popular")
-        )
-    )
-
-    protected class StatusFilter : UriPartFilter(
-        "Status",
-        arrayOf(
-            Pair("All", ""),
-            Pair("Ongoing", "ongoing"),
-            Pair("Completed", "completed"),
-            Pair("Hiatus", "hiatus"),
-            Pair("Dropped", "dropped")
-        )
-    )
-
-    protected class ProjectFilter : UriPartFilter(
-        "Filter Project",
-        arrayOf(
-            Pair("Show all manga", ""),
-            Pair("Show only project manga", "project-filter-on")
-        )
-    )
-
-    protected class Genre(name: String, val id: String = name) : Filter.TriState(name)
-    protected class GenreListFilter(genres: List<Genre>) : Filter.Group<Genre>("Genre", genres)
-
-    open val hasProjectPage = false
-
-    override fun getFilterList(): FilterList {
-        val filters = mutableListOf<Filter<*>>(
-            Filter.Header("NOTE: Ignored if using text search!"),
-            Filter.Header("Genre exclusion not available for all sources"),
-            Filter.Separator(),
-            AuthorFilter(),
-            YearFilter(),
-            StatusFilter(),
-            TypeFilter(),
-            SortByFilter(),
-            GenreListFilter(getGenreList()),
-        )
-        if (hasProjectPage) {
-            filters.addAll(
-                mutableListOf<Filter<*>>(
-                    Filter.Separator(),
-                    Filter.Header("NOTE: cant be used with other filter!"),
-                    Filter.Header("$name Project List page"),
-                    ProjectFilter(),
-                )
-            )
-        }
-        return FilterList(filters)
-    }
-
-    protected open fun getGenreList(): List<Genre> = listOf(
-        Genre("4 Koma", "4-koma"),
-        Genre("Action", "action"),
-        Genre("Adult", "adult"),
-        Genre("Adventure", "adventure"),
-        Genre("Comedy", "comedy"),
-        Genre("Completed", "completed"),
-        Genre("Cooking", "cooking"),
-        Genre("Crime", "crime"),
-        Genre("Cultivation", "cultivation"),
-        Genre("Demon", "demon"),
-        Genre("Demons", "demons"),
-        Genre("Doujinshi", "doujinshi"),
-        Genre("Drama", "drama"),
-        Genre("Dungeons", "dungeons"),
-        Genre("Ecchi", "ecchi"),
-        Genre("Fantasy", "fantasy"),
-        Genre("Game", "game"),
-        Genre("Games", "games"),
-        Genre("Gender Bender", "gender-bender"),
-        Genre("Genius", "genius"),
-        Genre("Gore", "gore"),
-        Genre("Harem", "harem"),
-        Genre("Hero", "hero"),
-        Genre("Historical", "historical"),
-        Genre("Horror", "horror"),
-        Genre("Isekai", "isekai"),
-        Genre("Josei", "josei"),
-        Genre("Magic", "magic"),
-        Genre("Manga", "manga"),
-        Genre("Manhua", "manhua"),
-        Genre("Manhwa", "manhwa"),
-        Genre("Martial Art", "martial-art"),
-        Genre("Martial Arts", "martial-arts"),
-        Genre("Mature", "mature"),
-        Genre("Mecha", "mecha"),
-        Genre("Military", "military"),
-        Genre("Monster", "monster"),
-        Genre("Monster Girls", "monster-girls"),
-        Genre("Monsters", "monsters"),
-        Genre("Music", "music"),
-        Genre("Murim", "murim"),
-        Genre("Mystery", "mystery"),
-        Genre("One-shot", "one-shot"),
-        Genre("Oneshot", "oneshot"),
-        Genre("Overpowered", "overpowered"),
-        Genre("Police", "police"),
-        Genre("Pshycological", "pshycological"),
-        Genre("Psychological", "psychological"),
-        Genre("Reincarnation", "reincarnation"),
-        Genre("Reverse Harem", "reverse-harem"),
-        Genre("Return", "return"),
-        Genre("Romancce", "romancce"),
-        Genre("Romance", "romance"),
-        Genre("Samurai", "samurai"),
-        Genre("School", "school"),
-        Genre("School Life", "school-life"),
-        Genre("Sci-fi", "sci-fi"),
-        Genre("Seinen", "seinen"),
-        Genre("Shoujo", "shoujo"),
-        Genre("Shoujo Ai", "shoujo-ai"),
-        Genre("Shounen", "shounen"),
-        Genre("Shounen Ai", "shounen-ai"),
-        Genre("Slice of Life", "slice-of-life"),
-        Genre("Sports", "sports"),
-        Genre("Super Power", "super-power"),
-        Genre("Supernatural", "supernatural"),
-        Genre("Thriller", "thriller"),
-        Genre("Time Travel", "time-travel"),
-        Genre("Tragedy", "tragedy"),
-        Genre("Vampire", "vampire"),
-        Genre("Villain", "villain"),
-        Genre("Webtoon", "webtoon"),
-        Genre("Webtoons", "webtoons"),
-        Genre("Yaoi", "yaoi"),
-        Genre("Yuri", "yuri"),
-        Genre("Zombies", "zombies")
-    )
-
-    open class UriPartFilter(displayName: String, private val vals: Array<Pair<String, String>>) :
-        Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
-        fun toUriPart() = vals[state].second
-    }
-
-    companion object {
-        private const val MID_QUALITY = 1
-        private const val LOW_QUALITY = 2
-
-        private const val SHOW_THUMBNAIL_PREF_Title = "Default thumbnail quality"
-        private const val SHOW_THUMBNAIL_PREF = "showThumbnailDefault"
-
-        const val URL_SEARCH_PREFIX = "url:"
-
-        private val MANGA_PAGE_ID_REGEX = "post_id\\s*:\\s*(\\d+)\\}".toRegex()
-        private val CHAPTER_PAGE_ID_REGEX = "chapter_id\\s*=\\s*(\\d+);?".toRegex()
-    }
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStreamGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStreamGenerator.kt
deleted file mode 100644
index d812e4361..000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStreamGenerator.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.wpmangastream
-
-import generator.ThemeSourceData.MultiLang
-import generator.ThemeSourceData.SingleLang
-import generator.ThemeSourceGenerator
-
-class WPMangaStreamGenerator : ThemeSourceGenerator {
-
-    override val themePkg = "wpmangastream"
-
-    override val themeClass = "WPMangaStream"
-
-    override val baseVersionCode: Int = 15
-
-    override val sources = listOf(
-        MultiLang("Asura Scans", "https://www.asurascans.com", listOf("en", "tr"), className = "AsuraScansFactory", pkgName = "asurascans", overrideVersionCode = 16),
-        SingleLang("Animated Glitched Scans", "https://anigliscans.com", "en"),
-        SingleLang("Boosei", "https://boosei.com", "id", overrideVersionCode = 1),
-        SingleLang("GoGoManga", "https://gogomanga.fun", "en", overrideVersionCode = 1),
-        SingleLang("Imagine Scan", "https://imaginescan.com.br", "pt-BR", isNsfw = true, overrideVersionCode = 1),
-        SingleLang("Imperfect Comics", "https://imperfectcomic.com", "en", overrideVersionCode = 8),
-        SingleLang("Infernal Void Scans", "https://void-scans.com", "en", overrideVersionCode = 4),
-        SingleLang("Kanzenin", "https://kanzenin.xyz", "id", isNsfw = true),
-        SingleLang("KlanKomik", "https://klankomik.com", "id", overrideVersionCode = 1),
-        SingleLang("Komik AV", "https://komikav.com", "id", overrideVersionCode = 1),
-        SingleLang("Komik Cast", "https://komikcast.me", "id", overrideVersionCode = 12),
-        SingleLang("Komik Station", "https://komikstation.co", "id", overrideVersionCode = 3),
-        SingleLang("KomikIndo.co", "https://komikindo.co", "id", className = "KomikindoCo", overrideVersionCode = 3),
-        SingleLang("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en", className = "KumaScans", overrideVersionCode = 1),
-        SingleLang("Manga Pro", "https://mangaprotm.com", "ar", pkgName = "mangaproz", overrideVersionCode = 3),
-        SingleLang("Manga Raw.org", "https://mangaraw.org", "ja", className = "MangaRawOrg", overrideVersionCode = 1),
-        SingleLang("Manhwax", "https://manhwax.com", "en", isNsfw = true),
-        SingleLang("MangaSwat", "https://swatmanga.co", "ar", overrideVersionCode = 7),
-        SingleLang("Mangakyo", "https://www.mangakyo.me", "id"),
-        SingleLang("Mareceh", "https://mareceh.com", "id", isNsfw = true, pkgName = "mangceh", overrideVersionCode = 10),
-        SingleLang("MasterKomik", "https://masterkomik.com", "id", overrideVersionCode = 1),
-        SingleLang("Mihentai", "https://mihentai.com", "en", isNsfw = true, overrideVersionCode = 1),
-        SingleLang("Non-Stop Scans", "https://www.nonstopscans.com", "en", className = "NonStopScans"),
-        SingleLang("NoxSubs", "https://noxsubs.com", "tr"),
-        SingleLang("Omega Scans", "https://omegascans.org", "en", isNsfw = true),
-        SingleLang("Phantom Scans", "https://phantomscans.com", "en", overrideVersionCode = 1),
-        SingleLang("Phoenix Fansub", "https://phoenixfansub.com", "es", overrideVersionCode = 2),
-        SingleLang("Random Scans", "https://randomscans.xyz", "en"),
-        SingleLang("Rawkuma", "https://rawkuma.com/", "ja"),
-        SingleLang("Readkomik", "https://readkomik.com", "en", className = "ReadKomik", overrideVersionCode = 1),
-        SingleLang("Sekte Doujin", "https://sektedoujin.club", "id", isNsfw = true, overrideVersionCode = 3),
-        SingleLang("Sekte Komik", "https://sektekomik.com", "id", overrideVersionCode = 4),
-        SingleLang("Shadow Mangas", "https://shadowmangas.com", "es"),
-        SingleLang("Shea Manga", "https://sheakomik.com", "id", overrideVersionCode = 4),
-        SingleLang("Snudae Scans", "https://snudaescans.com", "en", isNsfw = true, className = "BatotoScans", overrideVersionCode = 1),
-        SingleLang("Summer Fansub", "https://smmr.in", "pt-BR", isNsfw = true),
-        SingleLang("Tempest Manga", "https://manga.tempestfansub.com", "tr"),
-        SingleLang("The Apollo Team", "https://theapollo.team", "en"),
-        SingleLang("TukangKomik", "https://tukangkomik.com", "id"),
-        SingleLang("West Manga", "https://westmanga.info", "id", overrideVersionCode = 1),
-        SingleLang("xCaliBR Scans", "https://xcalibrscans.com", "en", overrideVersionCode = 3),
-    )
-
-    companion object {
-        @JvmStatic
-        fun main(args: Array<String>) {
-            WPMangaStreamGenerator().createAll()
-        }
-    }
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStreamUrlActivity.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStreamUrlActivity.kt
deleted file mode 100644
index 2e145cf09..000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/wpmangastream/WPMangaStreamUrlActivity.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.wpmangastream
-
-import android.app.Activity
-import android.content.ActivityNotFoundException
-import android.content.Intent
-import android.os.Bundle
-import android.util.Log
-import kotlin.system.exitProcess
-
-class WPMangaStreamUrlActivity : Activity() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        val pathSegments = intent?.data?.pathSegments
-
-        if (pathSegments != null && pathSegments.size >= 1) {
-
-            val mainIntent = Intent().apply {
-                action = "eu.kanade.tachiyomi.SEARCH"
-                putExtra("query", "${WPMangaStream.URL_SEARCH_PREFIX}${intent?.data?.toString()}")
-                putExtra("filter", packageName)
-            }
-            try {
-                startActivity(mainIntent)
-            } catch (e: ActivityNotFoundException) {
-                Log.e("WPMangaStreamUrl", e.toString())
-            }
-        } else {
-            Log.e("WPMangaStreamUrl", "could not parse uri from intent $intent")
-        }
-
-        finish()
-        exitProcess(0)
-    }
-}