diff --git a/src/vi/MangaXY/AndroidManifest.xml b/src/vi/MangaXY/AndroidManifest.xml
deleted file mode 100644
index 8072ee00d..000000000
--- a/src/vi/MangaXY/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest />
diff --git a/src/vi/MangaXY/build.gradle b/src/vi/MangaXY/build.gradle
deleted file mode 100644
index b922a1d47..000000000
--- a/src/vi/MangaXY/build.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-ext {
-    extName = 'MangaXY'
-    extClass = '.MangaXY'
-    extVersionCode = 2
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/vi/MangaXY/res/mipmap-hdpi/ic_launcher.png b/src/vi/MangaXY/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index f9e48c8f3..000000000
Binary files a/src/vi/MangaXY/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/vi/MangaXY/res/mipmap-mdpi/ic_launcher.png b/src/vi/MangaXY/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index eea7e8394..000000000
Binary files a/src/vi/MangaXY/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/vi/MangaXY/res/mipmap-xhdpi/ic_launcher.png b/src/vi/MangaXY/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 2ced1b6cb..000000000
Binary files a/src/vi/MangaXY/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/vi/MangaXY/res/mipmap-xxhdpi/ic_launcher.png b/src/vi/MangaXY/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 3377f2e97..000000000
Binary files a/src/vi/MangaXY/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/vi/MangaXY/res/mipmap-xxxhdpi/ic_launcher.png b/src/vi/MangaXY/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 2e1bc0c5d..000000000
Binary files a/src/vi/MangaXY/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/vi/MangaXY/src/eu/kanade/tachiyomi/extension/vi/MangaXY/MangaXY.kt b/src/vi/MangaXY/src/eu/kanade/tachiyomi/extension/vi/MangaXY/MangaXY.kt
deleted file mode 100644
index 07d9ec378..000000000
--- a/src/vi/MangaXY/src/eu/kanade/tachiyomi/extension/vi/MangaXY/MangaXY.kt
+++ /dev/null
@@ -1,387 +0,0 @@
-package eu.kanade.tachiyomi.extension.vi.MangaXY
-
-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.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.ParsedHttpSource
-import okhttp3.Headers
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.OkHttpClient
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import org.jsoup.select.Elements
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.TimeZone
-
-class MangaXY : ParsedHttpSource() {
-
-    override val name = "MangaXY"
-
-    override val baseUrl = "https://mangaxy.com"
-
-    override val lang = "vi"
-
-    override val supportsLatest = true
-
-    override val client: OkHttpClient = network.cloudflareClient
-
-    override fun headersBuilder() = Headers.Builder()
-        .add("Referer", "$baseUrl/")
-
-    private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).apply {
-        timeZone = TimeZone.getTimeZone("Asia/Ho_Chi_Minh")
-    }
-
-    override fun popularMangaRequest(page: Int) = GET(
-        "$baseUrl/search.php".toHttpUrl().newBuilder()
-            .addQueryParameter("act", "search")
-            .addQueryParameter("sort", "xem")
-            .addQueryParameter("view", "thumb")
-            .addQueryParameter("page", page.toString())
-            .toString(),
-        headers,
-    )
-
-    override fun popularMangaSelector() = ".container > .row > div.col-12.col-lg-9 > #tblChap > .thumb"
-
-    override fun popularMangaNextPageSelector(): String = "div#tblChap p.page a:contains(Cuối)"
-
-    override fun popularMangaFromElement(element: Element): SManga {
-        val manga = SManga.create()
-        element.select("a.name").first()!!.let {
-            manga.setUrlWithoutDomain(it.attr("href"))
-            manga.title = it.text().trim()
-        }
-        manga.thumbnail_url = element.select(".item img")
-            .first()!!
-            .attr("style")
-            .substringAfter("url('")
-            .substringBefore("')")
-            .replace("//", "https:")
-            .replace("http:", "")
-        return manga
-    }
-
-    override fun latestUpdatesSelector() = popularMangaSelector()
-
-    override fun latestUpdatesRequest(page: Int) = GET(
-        "$baseUrl/search.php".toHttpUrl().newBuilder()
-            .addQueryParameter("act", "search")
-            .addQueryParameter("sort", "chap")
-            .addQueryParameter("view", "thumb")
-            .addQueryParameter("page", page.toString())
-            .toString(),
-        headers,
-    )
-
-    override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
-
-    override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
-
-    open class UriPartFilter(
-        displayName: String,
-        private val vals: Array<Pair<String, String>>,
-        state: Int = 0,
-    ) :
-        Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray(), state) {
-        fun toUriPart() = vals[state].second
-    }
-
-    private class SortByFilter : UriPartFilter(
-        "Sắp xếp theo",
-        arrayOf(
-            Pair("Chap mới", "chap"),
-            Pair("Truyện mới", "truyen"),
-            Pair("Xem nhiều", "xem"),
-            Pair("Theo ABC", "ten"),
-            Pair("Số Chương", "sochap"),
-        ),
-        2,
-    )
-
-    private class SearchTypeFilter : UriPartFilter(
-        "Kiểu tìm",
-        arrayOf(
-            Pair("AND/và", "and"),
-            Pair("OR/hoặc", "or"),
-        ),
-    )
-
-    private class ForFilter : UriPartFilter(
-        "Dành cho",
-        arrayOf(
-            Pair("Bất kì", ""),
-            Pair("Con gái", "gai"),
-            Pair("Con trai", "trai"),
-            Pair("Con nít", "nit"),
-        ),
-    )
-
-    private class AgeFilter : UriPartFilter(
-        "Bất kỳ",
-        arrayOf(
-            Pair("Bất kì", ""),
-            Pair("= 13", "13"),
-            Pair("= 14", "14"),
-            Pair("= 15", "15"),
-            Pair("= 16", "16"),
-            Pair("= 17", "17"),
-            Pair("= 18", "18"),
-        ),
-    )
-
-    private class StatusFilter : UriPartFilter(
-        "Tình trạng",
-        arrayOf(
-            Pair("Bất kì", ""),
-            Pair("Đang dịch", "Ongoing"),
-            Pair("Hoàn thành", "Complete"),
-            Pair("Tạm ngưng", "Drop"),
-        ),
-    )
-
-    private class OriginFilter : UriPartFilter(
-        "Quốc gia",
-        arrayOf(
-            Pair("Bất kì", ""),
-            Pair("Nhật Bản", "nhat"),
-            Pair("Trung Quốc", "trung"),
-            Pair("Hàn Quốc", "han"),
-            Pair("Việt Nam", "vietnam"),
-        ),
-    )
-
-    private class ReadingModeFilter : UriPartFilter(
-        "Kiểu đọc",
-        arrayOf(
-            Pair("Bất kì", ""),
-            Pair("Chưa xác định", "chưa xác định"),
-            Pair("Phải qua trái", "xem từ phải qua trái"),
-            Pair("Trái qua phải", "xem từ trái qua phải"),
-        ),
-    )
-
-    private class YearFilter : Filter.Text("Năm phát hành")
-    private class UserFilter : Filter.Text("Đăng bởi thành viên")
-    private class AuthorFilter : Filter.Text("Tên tác giả")
-    private class SourceFilter : Filter.Text("Nguồn/Nhóm dịch")
-
-    override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET(
-        "$baseUrl/search.php".toHttpUrl().newBuilder().apply {
-            addQueryParameter("act", "timnangcao")
-            addQueryParameter("view", "thumb")
-            addQueryParameter("page", page.toString())
-
-            if (query.isNotEmpty()) {
-                addQueryParameter("q", query)
-            }
-
-            (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
-                when (filter) {
-                    is SortByFilter -> addQueryParameter("sort", filter.toUriPart())
-                    is SearchTypeFilter -> addQueryParameter("andor", filter.toUriPart())
-                    is ForFilter -> if (filter.state != 0) {
-                        addQueryParameter("danhcho", filter.toUriPart())
-                    }
-                    is AgeFilter -> if (filter.state != 0) {
-                        addQueryParameter("DoTuoi", filter.toUriPart())
-                    }
-                    is StatusFilter -> if (filter.state != 0) {
-                        addQueryParameter("TinhTrang", filter.toUriPart())
-                    }
-                    is OriginFilter -> if (filter.state != 0) {
-                        addQueryParameter("quocgia", filter.toUriPart())
-                    }
-                    is ReadingModeFilter -> if (filter.state != 0) {
-                        addQueryParameter("KieuDoc", filter.toUriPart())
-                    }
-                    is YearFilter -> if (filter.state.isNotEmpty()) {
-                        addQueryParameter("NamPhaHanh", filter.state)
-                    }
-                    is UserFilter -> if (filter.state.isNotEmpty()) {
-                        addQueryParameter("u", filter.state)
-                    }
-                    is AuthorFilter -> if (filter.state.isNotEmpty()) {
-                        addQueryParameter("TacGia", filter.state)
-                    }
-                    is SourceFilter -> if (filter.state.isNotEmpty()) {
-                        addQueryParameter("Nguon", filter.state)
-                    }
-                    is GenreList -> {
-                        addQueryParameter(
-                            "baogom",
-                            filter.state
-                                .filter { it.state == Filter.TriState.STATE_INCLUDE }
-                                .joinToString(",") { it.id },
-                        )
-                        addQueryParameter(
-                            "khonggom",
-                            filter.state
-                                .filter { it.state == Filter.TriState.STATE_EXCLUDE }
-                                .joinToString(",") { it.id },
-                        )
-                    }
-                    else -> {}
-                }
-            }
-        }.build().toString(),
-        headers,
-    )
-
-    override fun searchMangaSelector() = popularMangaSelector()
-
-    override fun searchMangaFromElement(element: Element): SManga {
-        return popularMangaFromElement(element)
-    }
-
-    override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
-
-    override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
-        val infoElement = document.selectFirst(".tab-content")!!
-        val infoTop = document.selectFirst(".detail-top-wrap")!!
-        val statusString0 = infoElement.select("div.manga-info > ul > li:nth-child(3) > a").firstOrNull()?.text()
-        val statusString1 = infoElement.select("div.manga-info > ul > li:nth-child(4) > a").firstOrNull()?.text()
-        val statusString2 = infoElement.select("div.manga-info > ul > li:nth-child(5) > a").firstOrNull()?.text()
-        title = infoTop.select("h1.comics-title").text()
-        author = infoTop.select(".created-by").joinToString { it.text() }
-        genre = infoTop.select(".top-comics-type a").toList()
-            .filter { it.text().isNotEmpty() }
-            .joinToString(", ") { it.text() }
-        description = infoElement.select(".manga-info p").textWithLinebreaks()
-        thumbnail_url = infoTop.select(".detail-top-right img")
-            .first()!!
-            .attr("style")
-            .substringAfter("url('")
-            .substringBefore("')")
-            .replace("//", "https:")
-            .replace("http:", "")
-        if (statusString0 == "Tạm ngưng" || statusString0 == "Đã Hoàn Thành" || statusString0 == "Đang tiến hành") {
-            status = when (statusString0) {
-                "Đang tiến hành" -> SManga.ONGOING
-                "Đã Hoàn Thành" -> SManga.COMPLETED
-                "Tạm ngưng" -> SManga.ON_HIATUS
-                null -> SManga.UNKNOWN
-                else -> SManga.UNKNOWN
-            }
-        }
-        if (statusString1 == "Tạm ngưng" || statusString1 == "Đã Hoàn Thành" || statusString1 == "Đang tiến hành") {
-            status = when (statusString1) {
-                "Đang tiến hành" -> SManga.ONGOING
-                "Đã Hoàn Thành" -> SManga.COMPLETED
-                "Tạm ngưng" -> SManga.ON_HIATUS
-                null -> SManga.UNKNOWN
-                else -> SManga.UNKNOWN
-            }
-        }
-        if (statusString2 == "Tạm ngưng" || statusString2 == "Đã Hoàn Thành" || statusString2 == "Đang tiến hành") {
-            status = when (statusString2) {
-                "Đang tiến hành" -> SManga.ONGOING
-                "Đã Hoàn Thành" -> SManga.COMPLETED
-                "Tạm ngưng" -> SManga.ON_HIATUS
-                null -> SManga.UNKNOWN
-                else -> SManga.UNKNOWN
-            }
-        }
-    }
-
-    private fun Elements.textWithLinebreaks(): String {
-        this.select("p").prepend("\\n")
-        this.select("br").prepend("\\n")
-        return this.text().replace("\\n", "\n").replace("\n ", "\n")
-    }
-
-    override fun chapterListSelector() = "#ChapList > .episode-item"
-    override fun chapterFromElement(element: Element) = SChapter.create().apply {
-        setUrlWithoutDomain(element.select(".episode-item").first()!!.attr("abs:href"))
-        name = element.select(".episode-title").first()!!.text()
-        date_upload = runCatching {
-            dateFormat.parse(element.select("div.episode-date > time").attr("datetime"))?.time
-        }.getOrNull() ?: 0L
-    }
-
-    override fun pageListParse(document: Document): List<Page> {
-        return document.select("img.img-fluid").mapIndexed { i, img ->
-            Page(i, imageUrl = img.attr("abs:src"))
-        }
-    }
-
-    override fun imageUrlParse(document: Document) = throw UnsupportedOperationException()
-
-    open class Genre(name: String, val id: String) : Filter.TriState(name)
-    private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Thể loại", genres)
-
-    override fun getFilterList() = FilterList(
-        GenreList(getGenreList()),
-        SortByFilter(),
-        SearchTypeFilter(),
-        ForFilter(),
-        AgeFilter(),
-        StatusFilter(),
-        OriginFilter(),
-        ReadingModeFilter(),
-        YearFilter(),
-        UserFilter(),
-        AuthorFilter(),
-        SourceFilter(),
-    )
-
-    private fun getGenreList() = listOf(
-        Genre("Phát Hành Tại TT8", "106"),
-        Genre("Webtoons", "112"),
-        Genre("Manga", "141"),
-        Genre("Truyện Màu", "113"),
-        Genre("Action", "52"),
-        Genre("Adult", "53"),
-        Genre("Adventure", "65"),
-        Genre("Anime", "107"),
-        Genre("Biseinen", "123"),
-        Genre("Bishounen", "122"),
-        Genre("Comedy", "50"),
-        Genre("Demons", ""),
-        Genre("Doujinshi", "72"),
-        Genre("Drama", "73"),
-        Genre("Ecchi", "74"),
-        Genre("Fantasy", "75"),
-        Genre("Gender Bender", "76"),
-        Genre("Harem", "77"),
-        Genre("Hentai", ""),
-        Genre("Historical", "78"),
-        Genre("Horror", "79"),
-        Genre("Isekai", "139"),
-        Genre("Josei", "80"),
-        Genre("Live action", "81"),
-        Genre("Magic", "116"),
-        Genre("Martial Arts", "84"),
-        Genre("Mature", "85"),
-        Genre("Manhua", "82"),
-        Genre("Manhwa", "83"),
-        Genre("Mecha", "86"),
-        Genre("Mystery", "87"),
-        Genre("One-shot", "88"),
-        Genre("Oneshot", ""),
-        Genre("Other", ""),
-        Genre("Psychological", "89"),
-        Genre("Romance", "90"),
-        Genre("School Life", "91"),
-        Genre("Sci fi", "92"),
-        Genre("Seinen", "93"),
-        Genre("Shotacon", ""),
-        Genre("Shoujo", "94"),
-        Genre("Shoujo Ai", "66"),
-        Genre("Shounen", "96"),
-        Genre("Shounen Ai", "97"),
-        Genre("Slash", "121"),
-        Genre("Slice of Life", "98"),
-        Genre("Smut", "99"),
-        Genre("Sports", "101"),
-        Genre("Super power", ""),
-        Genre("Supernatural", "102"),
-        Genre("Tragedy", "104"),
-        Genre("Yaoi", "114"),
-        Genre("Yuri", "111"),
-    )
-}