diff --git a/src/all/mangapark/AndroidManifest.xml b/src/all/mangapark/AndroidManifest.xml
new file mode 100644
index 000000000..dc0ffa3cf
--- /dev/null
+++ b/src/all/mangapark/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+package="eu.kanade.tachiyomi.extension">
+
+<application>
+    <activity
+        android:name=".all.mangapark.MangaParkUrlActivity"
+        android:excludeFromRecents="true"
+        android:theme="@android:style/Theme.NoDisplay">
+        <intent-filter>
+            <action android:name="android.intent.action.VIEW" />
+
+            <category android:name="android.intent.category.DEFAULT" />
+            <category android:name="android.intent.category.BROWSABLE" />
+
+            <data
+                android:host="mangapark.net"
+                android:pathPattern="/comic/..*"
+                android:scheme="https" />
+        </intent-filter>
+    </activity>
+</application>
+</manifest>
diff --git a/src/all/mangapark/build.gradle b/src/all/mangapark/build.gradle
new file mode 100644
index 000000000..e1fb3d995
--- /dev/null
+++ b/src/all/mangapark/build.gradle
@@ -0,0 +1,13 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+
+ext {
+    extName = 'MangaPark v3'
+    pkgNameSuffix = 'all.mangapark'
+    extClass = '.MangaParkFactory'
+    extVersionCode = 1
+    libVersion = '1.2'
+    containsNsfw = true
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/all/mangapark/res/mipmap-hdpi/ic_launcher.png b/src/all/mangapark/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..74307452b
Binary files /dev/null and b/src/all/mangapark/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/all/mangapark/res/mipmap-mdpi/ic_launcher.png b/src/all/mangapark/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..317550192
Binary files /dev/null and b/src/all/mangapark/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/all/mangapark/res/mipmap-xhdpi/ic_launcher.png b/src/all/mangapark/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..8e63f732a
Binary files /dev/null and b/src/all/mangapark/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/all/mangapark/res/mipmap-xxhdpi/ic_launcher.png b/src/all/mangapark/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..934da61ca
Binary files /dev/null and b/src/all/mangapark/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/all/mangapark/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/mangapark/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..dfbb1479a
Binary files /dev/null and b/src/all/mangapark/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/all/mangapark/res/web_hi_res_512.png b/src/all/mangapark/res/web_hi_res_512.png
new file mode 100644
index 000000000..eb894066e
Binary files /dev/null and b/src/all/mangapark/res/web_hi_res_512.png differ
diff --git a/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaPark.kt b/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaPark.kt
new file mode 100644
index 000000000..ed49bb8aa
--- /dev/null
+++ b/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaPark.kt
@@ -0,0 +1,470 @@
+package eu.kanade.tachiyomi.extension.all.mangapark
+
+import com.squareup.duktape.Duktape
+import eu.kanade.tachiyomi.network.GET
+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 okhttp3.HttpUrl.Companion.toHttpUrlOrNull
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import org.json.JSONArray
+import org.json.JSONObject
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import java.util.Calendar
+import java.util.concurrent.TimeUnit
+import okhttp3.Response
+import rx.Observable
+
+open class MangaPark(
+    override val lang: String,
+    private val siteLang: String
+) : ParsedHttpSource() {
+
+    override val name: String = "MangaPark v3"
+    override val baseUrl: String = "https://mangapark.net"
+
+    override val supportsLatest = true
+
+    override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+        .connectTimeout(10, TimeUnit.SECONDS)
+        .readTimeout(30, TimeUnit.SECONDS)
+        .build()
+
+    override fun latestUpdatesRequest(page: Int): Request {
+        return GET("$baseUrl/browse?sort=update&page=$page")
+    }
+
+    override fun latestUpdatesSelector(): String {
+        return "div#subject-list div.col"
+    }
+
+    override fun latestUpdatesFromElement(element: Element): SManga {
+        val manga = SManga.create()
+        val item = element.select("a.position-relative")
+        val imgurl = item.select("img").attr("abs:src")
+        manga.setUrlWithoutDomain(item.attr("href"))
+        manga.title = element.select("a.fw-bold").text()
+        manga.thumbnail_url = imgurl
+        return manga
+    }
+
+    override fun latestUpdatesNextPageSelector() = "div#mainer nav.d-none .pagination .page-item:last-of-type:not(.disabled)"
+
+    override fun popularMangaRequest(page: Int): Request {
+        return GET("$baseUrl/browse?sort=d007&page=$page")
+    }
+
+    override fun popularMangaSelector() = latestUpdatesSelector()
+
+    override fun popularMangaFromElement(element: Element) = latestUpdatesFromElement(element)
+
+    override fun popularMangaNextPageSelector() = latestUpdatesNextPageSelector()
+
+    override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
+        return when {
+            query.startsWith("ID:") -> {
+                val id = query.substringAfter("ID:")
+                client.newCall(GET("$baseUrl/series/$id", headers)).asObservableSuccess()
+                    .map { response ->
+                        queryIDParse(response, id)
+                    }
+            }
+
+            query.isNotBlank() -> {
+                val url = "$baseUrl/search?word=$query&page=$page"
+                client.newCall(GET(url, headers)).asObservableSuccess()
+                    .map { response ->
+                        queryParse(response)
+                    }
+            }
+
+            else -> {
+                val sortFilter = filters.findInstance<SortFilter>()!!
+                val reverseSortFilter = filters.findInstance<ReverseSortFilter>()!!
+                val statusFilter = filters.findInstance<StatusFilter>()!!
+                val genreFilter = filters.findInstance<GenreGroupFilter>()!!
+                val minChapterFilter = filters.findInstance<MinChapterTextFilter>()!!
+                val maxChapterFilter = filters.findInstance<MaxChapterTextFilter>()!!
+                val url = "$baseUrl/browse".toHttpUrlOrNull()!!.newBuilder()
+                url.addQueryParameter("page", page.toString())
+
+
+                with (sortFilter) {
+                    if (reverseSortFilter.state) {
+                        url.addQueryParameter("sort","${this.selected}.az")
+                    } else {
+                        url.addQueryParameter("sort","${this.selected}.za")
+                    }
+                }
+
+                with (genreFilter) {
+                    url.addQueryParameter("genres", included.joinToString(",") + "|" + excluded.joinToString(",")
+                    )
+                }
+
+                with (statusFilter) {
+                    url.addQueryParameter("release", this.selected)
+                }
+
+                if (maxChapterFilter.state.isNotEmpty() or minChapterFilter.state.isNotEmpty()) {
+                    url.addQueryParameter("chapters", minChapterFilter.state + "-" + maxChapterFilter.state)
+                }
+
+                client.newCall(GET(url.build().toString(), headers)).asObservableSuccess()
+                    .map { response ->
+                        queryParse(response)
+                    }
+            }
+        }
+    }
+
+    private fun queryIDParse(response: Response, id: String): MangasPage {
+        val document = response.asJsoup()
+        val infoElement = document.select("div#mainer div.container-fluid")
+        val manga = SManga.create()
+        manga.title = infoElement.select("h3").text()
+        manga.thumbnail_url = document.select("div.attr-cover img")
+            .attr("abs:src")
+        manga.url = infoElement.select("h3 a").attr("abs:href")
+        return MangasPage(listOf(manga), false)
+    }
+
+    private fun queryParse(response: Response): MangasPage {
+        val mangas = mutableListOf<SManga>()
+        val document = response.asJsoup()
+        document.select("div#search-list div.col").forEach { element ->
+            mangas.add(latestUpdatesFromElement(element))
+        }
+        val nextPage = document.select(latestUpdatesNextPageSelector()).first() != null
+        return MangasPage(mangas, nextPage)
+    }
+
+    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = throw UnsupportedOperationException("Not used")
+    override fun searchMangaSelector() = throw UnsupportedOperationException("Not used")
+    override fun searchMangaFromElement(element: Element) = throw UnsupportedOperationException("Not used")
+    override fun searchMangaNextPageSelector() = throw UnsupportedOperationException("Not used")
+
+    override fun mangaDetailsRequest(manga: SManga): Request {
+        if (manga.url.startsWith("http")) {
+            return GET(manga.url, headers)
+        }
+        return super.mangaDetailsRequest(manga)
+    }
+
+    override fun mangaDetailsParse(document: Document): SManga {
+        val infoElement = document.select("div#mainer div.container-fluid")
+        val manga = SManga.create()
+        val genres = mutableListOf<String>()
+        val status = infoElement.select("div.attr-item:contains(status) span").text()
+        infoElement.select("div.attr-item:contains(genres) span").text().split(
+            " / "
+                .toRegex()
+        ).forEach { element ->
+            genres.add(element)
+        }
+        manga.title = infoElement.select("h3").text()
+        manga.author = infoElement.select("div.attr-item:contains(author) a:first-child").text().split(" / ".toRegex()).joinToString(", ")
+        manga.status = parseStatus(status)
+        manga.genre = infoElement.select("div.attr-item:contains(genre) span").text()
+        manga.description = infoElement.select("div.limit-height-body").text() //Needs to put new line before extra and notice and stuff.
+        manga.thumbnail_url = document.select("div.attr-cover img")
+            .attr("abs:src")
+        return manga
+    }
+
+    private fun parseStatus(status: String?) = when {
+        status == null -> SManga.UNKNOWN
+        status.contains("Ongoing") -> SManga.ONGOING
+        status.contains("Hiatus") -> SManga.ONGOING
+        status.contains("Completed") -> SManga.COMPLETED
+        else -> SManga.UNKNOWN
+    }
+
+    override fun chapterListRequest(manga: SManga): Request {
+        if (manga.url.startsWith("http")) {
+            return GET(manga.url, headers)
+        }
+        return super.chapterListRequest(manga)
+    }
+
+    override fun chapterListSelector() = "div#mainer div.container-fluid div.episode-list div#episodes-lang-$siteLang"
+
+    override fun chapterFromElement(element: Element): SChapter {
+        val chapter = SChapter.create()
+        val urlElement = element.select("a.chapt")
+        val url = urlElement.attr("href")
+        val time = element.select("div.extra > i.ps-2").text()
+        chapter.setUrlWithoutDomain(url)
+        chapter.name = urlElement.text()
+        chapter.chapter_number = url.split("/".toRegex()).last().toFloat()
+
+        if (time != "") {
+            chapter.date_upload = parseChapterDate(time)
+        }
+        return chapter
+    }
+
+    private fun parseChapterDate(date: String): Long {
+        val value = date.split(' ')[0].toInt()
+
+        return when {
+            "secs" in date -> Calendar.getInstance().apply {
+                add(Calendar.SECOND, value * -1)
+            }.timeInMillis
+            "mins" in date -> Calendar.getInstance().apply {
+                add(Calendar.MINUTE, value * -1)
+            }.timeInMillis
+            "hours" in date -> Calendar.getInstance().apply {
+                add(Calendar.HOUR_OF_DAY, value * -1)
+            }.timeInMillis
+            "days" in date -> Calendar.getInstance().apply {
+                add(Calendar.DATE, value * -1)
+            }.timeInMillis
+            "weeks" in date -> Calendar.getInstance().apply {
+                add(Calendar.DATE, value * 7 * -1)
+            }.timeInMillis
+            "months" in date -> Calendar.getInstance().apply {
+                add(Calendar.MONTH, value * -1)
+            }.timeInMillis
+            "years" in date -> Calendar.getInstance().apply {
+                add(Calendar.YEAR, value * -1)
+            }.timeInMillis
+            "sec" in date -> Calendar.getInstance().apply {
+                add(Calendar.SECOND, value * -1)
+            }.timeInMillis
+            "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 -> {
+                return 0
+            }
+        }
+    }
+
+    override fun pageListRequest(chapter: SChapter): Request {
+        if (chapter.url.startsWith("http")) {
+            return GET(chapter.url, headers)
+        }
+        return super.pageListRequest(chapter)
+    }
+
+    override fun pageListParse(document: Document): List<Page> {
+        val viewer = document.select("div#viewer")
+        val pages = mutableListOf<Page>()
+        viewer.select("div.item").forEach() { i ->
+            val index = i.select("span").text().split("/".toRegex())[0].toInt() - 1
+            val imageUrl = i.select("img").attr("abs:src")
+            pages.add(Page(index, "", imageUrl))
+        }
+
+        return pages
+    }
+
+    override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")
+
+    // Done Down
+
+    override fun getFilterList() = FilterList(
+        //LetterFilter(),
+        Filter.Header("NOTE: Ignored if using text search!"),
+        Filter.Separator(),
+        SortFilter(getSortFilter(), 10),
+        ReverseSortFilter(),
+        StatusFilter(getStatusFilter(), 0),
+        MinChapterTextFilter(),
+        MaxChapterTextFilter(),
+        GenreGroupFilter(getGenreFilter()),
+    )
+
+    class SelectFilterOption(val name: String, val value: String)
+    class CheckboxFilterOption(val value: String, name: String, default: Boolean = false) : Filter.CheckBox(name, default)
+    class TriStateFilterOption(val value: String, name: String, default: Int = 0) : Filter.TriState(name, default)
+
+    abstract class SelectFilter(name: String, private val options: List<SelectFilterOption>, default: Int = 0) : Filter.Select<String>(name, options.map { it.name }.toTypedArray(), default) {
+        val selected: String
+            get() = options[state].value
+    }
+    abstract class CheckboxGroupFilter(name: String, options: List<CheckboxFilterOption>) : Filter.Group<CheckboxFilterOption>(name, options) {
+        val selected: List<String>
+            get() = state.filter { it.state }.map { it.value }
+    }
+    abstract class TriStateGroupFilter(name: String, options: List<TriStateFilterOption>) : Filter.Group<TriStateFilterOption>(name, options) {
+        val included: List<String>
+            get() = state.filter { it.isIncluded() }.map { it.value }
+
+        val excluded: List<String>
+            get() = state.filter { it.isExcluded() }.map { it.value }
+    }
+    abstract class TextFilter(name: String) : Filter.Text(name)
+
+    class SortFilter(options: List<SelectFilterOption>, default: Int) : SelectFilter("Sort By", options, default)
+    class ReverseSortFilter(default: Boolean = false) : Filter.CheckBox("Revers Sort", default)
+    class StatusFilter(options: List<SelectFilterOption>, default: Int) : SelectFilter("Status", options, default)
+    class GenreGroupFilter(options: List<TriStateFilterOption>) : TriStateGroupFilter("Genre", options)
+    class MinChapterTextFilter : TextFilter("Min. Chapters")
+    class MaxChapterTextFilter : TextFilter("Max. Chapters")
+
+    private fun getSortFilter() = listOf(
+        SelectFilterOption("Rating", "rating"),
+        SelectFilterOption("Comments", "comments"),
+        SelectFilterOption("Discuss", "discuss"),
+        SelectFilterOption("Update", "update"),
+        SelectFilterOption("Create", "create"),
+        SelectFilterOption("Name", "name"),
+        SelectFilterOption("Total Views", "d000"),
+        SelectFilterOption("Most Views 360 days", "d360"),
+        SelectFilterOption("Most Views 180 days", "d180"),
+        SelectFilterOption("Most Views 90 days", "d090"),
+        SelectFilterOption("Most Views 30 days", "d030"),
+        SelectFilterOption("Most Views 7 days", "d007"),
+        SelectFilterOption("Most Views 24 hours", "h024"),
+        SelectFilterOption("Most Views 12 hours", "h012"),
+        SelectFilterOption("Most Views 6 hours", "h006"),
+        SelectFilterOption("Most Views 60 minutes", "h001"),
+    )
+
+    private fun getStatusFilter() = listOf(
+        SelectFilterOption("All", ""),
+        SelectFilterOption("Pending", "pending"),
+        SelectFilterOption("Ongoing", "ongoing"),
+        SelectFilterOption("Completed", "completed"),
+        SelectFilterOption("Hiatus", "hiatus"),
+        SelectFilterOption("Cancelled", "cancelled"),
+    )
+
+    private fun getGenreFilter() = listOf(
+        TriStateFilterOption("artbook","Artbook"),
+        TriStateFilterOption("cartoon","Cartoon"),
+        TriStateFilterOption("comic","Comic"),
+        TriStateFilterOption("doujinshi","Doujinshi"),
+        TriStateFilterOption("imageset","Imageset"),
+        TriStateFilterOption("manga","Manga"),
+        TriStateFilterOption("manhua","Manhua"),
+        TriStateFilterOption("manhwa","Manhwa"),
+        TriStateFilterOption("webtoon","Webtoon"),
+        TriStateFilterOption("western","Western"),
+        TriStateFilterOption("josei","Josei"),
+        TriStateFilterOption("seinen","Seinen"),
+        TriStateFilterOption("shoujo","Shoujo"),
+        TriStateFilterOption("shoujo_ai","Shoujo ai"),
+        TriStateFilterOption("shounen","Shounen"),
+        TriStateFilterOption("shounen_ai","Shounen ai"),
+        TriStateFilterOption("yaoi","Yaoi"),
+        TriStateFilterOption("yuri","Yuri"),
+        TriStateFilterOption("ecchi","Ecchi"),
+        TriStateFilterOption("mature","Mature"),
+        TriStateFilterOption("adult","Adult"),
+        TriStateFilterOption("gore","Gore"),
+        TriStateFilterOption("violence","Violence"),
+        TriStateFilterOption("smut","Smut"),
+        TriStateFilterOption("hentai","Hentai"),
+        TriStateFilterOption("_4_koma","4-Koma"),
+        TriStateFilterOption("action","Action"),
+        TriStateFilterOption("adaptation","Adaptation"),
+        TriStateFilterOption("adventure","Adventure"),
+        TriStateFilterOption("aliens","Aliens"),
+        TriStateFilterOption("animals","Animals"),
+        TriStateFilterOption("anthology","Anthology"),
+        TriStateFilterOption("cars","cars"),
+        TriStateFilterOption("comedy","Comedy"),
+        TriStateFilterOption("cooking","Cooking"),
+        TriStateFilterOption("crime","crime"),
+        TriStateFilterOption("crossdressing","Crossdressing"),
+        TriStateFilterOption("delinquents","Delinquents"),
+        TriStateFilterOption("dementia","Dementia"),
+        TriStateFilterOption("demons","Demons"),
+        TriStateFilterOption("drama","Drama"),
+        TriStateFilterOption("fantasy","Fantasy"),
+        TriStateFilterOption("fan_colored","Fan-Colored"),
+        TriStateFilterOption("full_color","Full Color"),
+        TriStateFilterOption("game","Game"),
+        TriStateFilterOption("gender_bender","Gender Bender"),
+        TriStateFilterOption("genderswap","Genderswap"),
+        TriStateFilterOption("ghosts","Ghosts"),
+        TriStateFilterOption("gyaru","Gyaru"),
+        TriStateFilterOption("harem","Harem"),
+        TriStateFilterOption("harlequin","Harlequin"),
+        TriStateFilterOption("historical","Historical"),
+        TriStateFilterOption("horror","Horror"),
+        TriStateFilterOption("incest","Incest"),
+        TriStateFilterOption("isekai","Isekai"),
+        TriStateFilterOption("kids","Kids"),
+        TriStateFilterOption("loli","Loli"),
+        TriStateFilterOption("lolicon","lolicon"),
+        TriStateFilterOption("magic","Magic"),
+        TriStateFilterOption("magical_girls","Magical Girls"),
+        TriStateFilterOption("martial_arts","Martial Arts"),
+        TriStateFilterOption("mecha","Mecha"),
+        TriStateFilterOption("medical","Medical"),
+        TriStateFilterOption("military","Military"),
+        TriStateFilterOption("monster_girls","Monster Girls"),
+        TriStateFilterOption("monsters","Monsters"),
+        TriStateFilterOption("music","Music"),
+        TriStateFilterOption("mystery","Mystery"),
+        TriStateFilterOption("netorare","Netorare/NTR"),
+        TriStateFilterOption("ninja","Ninja"),
+        TriStateFilterOption("office_workers","Office Workers"),
+        TriStateFilterOption("oneshot","Oneshot"),
+        TriStateFilterOption("parody","parody"),
+        TriStateFilterOption("philosophical","Philosophical"),
+        TriStateFilterOption("police","Police"),
+        TriStateFilterOption("post_apocalyptic","Post-Apocalyptic"),
+        TriStateFilterOption("psychological","Psychological"),
+        TriStateFilterOption("reincarnation","Reincarnation"),
+        TriStateFilterOption("reverse_harem","Reverse Harem"),
+        TriStateFilterOption("romance","Romance"),
+        TriStateFilterOption("samurai","Samurai"),
+        TriStateFilterOption("school_life","School Life"),
+        TriStateFilterOption("sci_fi","Sci-Fi"),
+        TriStateFilterOption("shota","Shota"),
+        TriStateFilterOption("shotacon","shotacon"),
+        TriStateFilterOption("slice_of_life","Slice of Life"),
+        TriStateFilterOption("sm_bdsm","SM/BDSM"),
+        TriStateFilterOption("space","Space"),
+        TriStateFilterOption("sports","Sports"),
+        TriStateFilterOption("super_power","Super Power"),
+        TriStateFilterOption("superhero","Superhero"),
+        TriStateFilterOption("supernatural","Supernatural"),
+        TriStateFilterOption("survival","Survival"),
+        TriStateFilterOption("thriller","Thriller"),
+        TriStateFilterOption("time_travel","Time Travel"),
+        TriStateFilterOption("traditional_games","Traditional Games"),
+        TriStateFilterOption("tragedy","Tragedy"),
+        TriStateFilterOption("vampires","Vampires"),
+        TriStateFilterOption("video_games","Video Games"),
+        TriStateFilterOption("virtual_reality","Virtual Reality"),
+        TriStateFilterOption("wuxia","Wuxia"),
+        TriStateFilterOption("xianxia","Xianxia"),
+        TriStateFilterOption("xuanhuan","Xuanhuan"),
+        TriStateFilterOption("zombies","Zombies"),
+        // Hidden Genres
+        TriStateFilterOption("award_winning", "Award Winning"),
+        TriStateFilterOption("youkai", "Youkai"),
+        TriStateFilterOption("uncategorized", "Uncategorized")
+    )
+
+    private inline fun <reified T> Iterable<*>.findInstance() = find { it is T } as? T
+}
diff --git a/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaParkFactory.kt b/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaParkFactory.kt
new file mode 100644
index 000000000..36e5115a8
--- /dev/null
+++ b/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaParkFactory.kt
@@ -0,0 +1,123 @@
+package eu.kanade.tachiyomi.extension.all.mangapark
+
+import eu.kanade.tachiyomi.annotations.Nsfw
+import eu.kanade.tachiyomi.source.Source
+import eu.kanade.tachiyomi.source.SourceFactory
+
+@Nsfw
+class MangaParkFactory : SourceFactory {
+    override fun createSources(): List<Source> = languages.map { MangaPark(it.lang, it.siteLang) }
+}
+
+class LanguageOption(val lang: String, val siteLang: String = lang)
+private val languages = listOf(
+    //LanguageOption("<Language Format>","<Language Format used in site.>"),
+    LanguageOption("en", "en"),
+    //LanguageOption("ar"),
+    //LanguageOption("bg"),
+    //LanguageOption("zh"),
+    //LanguageOption("cs"),
+    //LanguageOption("da"),
+    //LanguageOption("nl"),
+    //LanguageOption("fil"),
+    //LanguageOption("fi"),
+    //LanguageOption("fr"),
+    //LanguageOption("de"),
+    //LanguageOption("el"),
+    //LanguageOption("he"),
+    //LanguageOption("hi"),
+    //LanguageOption("hu"),
+    //LanguageOption("id"),
+    //LanguageOption("it"),
+    //LanguageOption("ja"),
+    //LanguageOption("ko"),
+    //LanguageOption("ms"),
+    //LanguageOption("pl"),
+    //LanguageOption("pt"),
+    //LanguageOption("pt-BR","pt_br"),
+    //LanguageOption("ro"),
+    //LanguageOption("ru"),
+    //LanguageOption("es"),
+    //LanguageOption("es-419","es_419"),
+    //LanguageOption("sv"),
+    //LanguageOption("th"),
+    //LanguageOption("tr"),
+    //LanguageOption("uk"),
+    //LanguageOption("vi"),
+    //LanguageOption("af"),
+    //LanguageOption("sq"),
+    //LanguageOption("am"),
+    //LanguageOption("hy"),
+    //LanguageOption("az"),
+    //LanguageOption("be"),
+    //LanguageOption("bn"),
+    //LanguageOption("bs"),
+    //LanguageOption("my"),
+    //LanguageOption("km"),
+    //LanguageOption("ca"),
+    //LanguageOption("ceb"),
+    //LanguageOption("zh-rHK","zh_hk"),
+    //LanguageOption("zh-rTW","zh_tw"),
+    //LanguageOption("hr"),
+    //LanguageOption("en-US","en_us"),
+    //LanguageOption("eo"),
+    //LanguageOption("et"),
+    //LanguageOption("fo"),
+    //LanguageOption("ka"),
+    //LanguageOption("gn"),
+    //LanguageOption("gu"),
+    //LanguageOption("ht",),
+    //LanguageOption("ha"),
+    //LanguageOption("is"),
+    //LanguageOption("ig"),
+    //LanguageOption("ga"),
+    //LanguageOption("jv"),
+    //LanguageOption("kn"),
+    //LanguageOption("kk"),
+    //LanguageOption("ku"),
+    //LanguageOption("ky"),
+    //LanguageOption("lo"),
+    //LanguageOption("lv"),
+    //LanguageOption("lt"),
+    //LanguageOption("lb"),
+    //LanguageOption("mk"),
+    //LanguageOption("mg"),
+    //LanguageOption("ml"),
+    //LanguageOption("mt"),
+    //LanguageOption("mi"),
+    //LanguageOption("mr"),
+    //LanguageOption("mo"),
+    //LanguageOption("mn"),
+    //LanguageOption("ne"),
+    //LanguageOption("no"),
+    //LanguageOption("ny"),
+    //LanguageOption("ps"),
+    //LanguageOption("fa"),
+    //LanguageOption("rm"),
+    //LanguageOption("sm"),
+    //LanguageOption("sr"),
+    //LanguageOption("sh",),
+    //LanguageOption("st"),
+    //LanguageOption("sn"),
+    //LanguageOption("sd"),
+    //LanguageOption("si"),
+    //LanguageOption("sk"),
+    //LanguageOption("sl"),
+    //LanguageOption("so"),
+    //LanguageOption("sw"),
+    //LanguageOption("tg"),
+    //LanguageOption("ta"),
+    //LanguageOption("ti"),
+    //LanguageOption("to"),
+    //LanguageOption("tk"),
+    //LanguageOption("ur"),
+    //LanguageOption("uz"),
+    //LanguageOption("yo"),
+    //LanguageOption("zu"),
+    //LanguageOption("other", "_t"),
+    // Lang options from bato.to brows not in publish.bato.to
+    //LanguageOption("eu"),
+    //LanguageOption("pt-PT","pt_pt"),
+    // Lang options that got removed
+    // Pair("xh", "xh"),
+)
diff --git a/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaParkUrlActivity.kt b/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaParkUrlActivity.kt
new file mode 100644
index 000000000..1890f2278
--- /dev/null
+++ b/src/all/mangapark/src/eu/kanade/tachiyomi/extension/all/mangapark/MangaParkUrlActivity.kt
@@ -0,0 +1,50 @@
+package eu.kanade.tachiyomi.extension.all.mangapark
+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 MangaParkUrlActivity : Activity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        val host = intent?.data?.host
+        val pathSegments = intent?.data?.pathSegments
+
+        if (host != null && pathSegments != null) {
+            val query = fromGuya(pathSegments)
+
+            if (query == null) {
+                Log.e("MangaParkUrlActivity", "Unable to parse URI from intent $intent")
+                finish()
+                exitProcess(1)
+            }
+
+            val mainIntent = Intent().apply {
+                action = "eu.kanade.tachiyomi.SEARCH"
+                putExtra("query", query)
+                putExtra("filter", packageName)
+            }
+
+            try {
+                startActivity(mainIntent)
+            } catch (e: ActivityNotFoundException) {
+                Log.e("MangaParkUrlActivity", e.toString())
+            }
+        }
+
+        finish()
+        exitProcess(0)
+    }
+
+    private fun fromGuya(pathSegments: MutableList<String>): String? {
+        return if (pathSegments.size >= 2) {
+            val id = pathSegments[1]
+            "ID:$id"
+        } else {
+            null
+        }
+    }
+}
diff --git a/src/en/mangapark/build.gradle b/src/en/mangapark/build.gradle
index 93123551b..9b5fbe4b9 100644
--- a/src/en/mangapark/build.gradle
+++ b/src/en/mangapark/build.gradle
@@ -5,7 +5,7 @@ ext {
     extName = 'MangaPark'
     pkgNameSuffix = 'en.mangapark'
     extClass = '.MangaPark'
-    extVersionCode = 19
+    extVersionCode = 20
     libVersion = '1.2'
 }