diff --git a/src/en/animension/AndroidManifest.xml b/src/en/animension/AndroidManifest.xml
new file mode 100644
index 000000000..acb4de356
--- /dev/null
+++ b/src/en/animension/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/src/en/animension/build.gradle b/src/en/animension/build.gradle
new file mode 100644
index 000000000..a5c4aa480
--- /dev/null
+++ b/src/en/animension/build.gradle
@@ -0,0 +1,12 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+
+ext {
+ extName = 'Animension'
+ pkgNameSuffix = 'en.animension'
+ extClass = '.Animension'
+ extVersionCode = 1
+ libVersion = '13'
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/en/animension/res/mipmap-hdpi/ic_launcher.png b/src/en/animension/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..bcc321bc8
Binary files /dev/null and b/src/en/animension/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/en/animension/res/mipmap-mdpi/ic_launcher.png b/src/en/animension/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..62a56a76f
Binary files /dev/null and b/src/en/animension/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/en/animension/res/mipmap-xhdpi/ic_launcher.png b/src/en/animension/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..786de1831
Binary files /dev/null and b/src/en/animension/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/en/animension/res/mipmap-xxhdpi/ic_launcher.png b/src/en/animension/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..2b1e9f73f
Binary files /dev/null and b/src/en/animension/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/en/animension/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/animension/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..6393c77d6
Binary files /dev/null and b/src/en/animension/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/en/animension/res/web_hi_res_512.png b/src/en/animension/res/web_hi_res_512.png
new file mode 100644
index 000000000..eb22d5d6b
Binary files /dev/null and b/src/en/animension/res/web_hi_res_512.png differ
diff --git a/src/en/animension/src/eu/kanade/tachiyomi/animeextension/en/animension/Animension.kt b/src/en/animension/src/eu/kanade/tachiyomi/animeextension/en/animension/Animension.kt
new file mode 100644
index 000000000..f951e8d20
--- /dev/null
+++ b/src/en/animension/src/eu/kanade/tachiyomi/animeextension/en/animension/Animension.kt
@@ -0,0 +1,243 @@
+package eu.kanade.tachiyomi.animeextension.en.animension
+
+import android.app.Application
+import android.content.SharedPreferences
+import androidx.preference.ListPreference
+import androidx.preference.PreferenceScreen
+import eu.kanade.tachiyomi.animeextension.en.animension.extractors.DoodExtractor
+import eu.kanade.tachiyomi.animeextension.en.animension.extractors.FembedExtractor
+import eu.kanade.tachiyomi.animeextension.en.animension.extractors.StreamSBExtractor
+import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
+import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
+import eu.kanade.tachiyomi.animesource.model.AnimesPage
+import eu.kanade.tachiyomi.animesource.model.SAnime
+import eu.kanade.tachiyomi.animesource.model.SEpisode
+import eu.kanade.tachiyomi.animesource.model.Video
+import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.JsonArray
+import kotlinx.serialization.json.JsonObject
+import kotlinx.serialization.json.float
+import kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonPrimitive
+import okhttp3.Request
+import okhttp3.Response
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+
+class Animension() : ConfigurableAnimeSource, AnimeHttpSource() {
+ override val lang = "en"
+
+ override val name = "Animension"
+
+ override val baseUrl = "https://animension.to/"
+
+ override val supportsLatest = false
+
+ private val apiUrl = "https://animension.to/public-api"
+
+ private val json = Json {
+ ignoreUnknownKeys = true
+ }
+
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ // Popular
+ override fun popularAnimeRequest(page: Int): Request =
+ GET("$apiUrl/search.php?dub=0&sort=popular-week&page=$page")
+
+ override fun popularAnimeParse(response: Response): AnimesPage {
+ val responseJson = json.decodeFromString(response.body!!.string())
+ val animes = responseJson.map { anime ->
+ val data = anime.jsonArray
+
+ SAnime.create().apply {
+ title = data[0].jsonPrimitive.content
+ url = data[1].jsonPrimitive.content
+ thumbnail_url = data[2].jsonPrimitive.content
+ }
+ }
+ val hasNextPage = responseJson.size >= 25
+
+ return AnimesPage(animes, hasNextPage)
+ }
+
+ // Episode
+ override fun episodeListRequest(anime: SAnime): Request {
+ return (GET("$apiUrl/episodes.php?id=${anime.url}", headers))
+ }
+
+ override fun episodeListParse(response: Response): List {
+ val responseJson = json.decodeFromString(response.body!!.string())
+ val episodes = responseJson.map { episode ->
+ val data = episode.jsonArray
+
+ SEpisode.create().apply {
+ name = "Episode ${data[2]}"
+ url = data[1].jsonPrimitive.content
+ episode_number = data[2].jsonPrimitive.float
+ }
+ }
+ return episodes
+ }
+
+ // Vide urls
+ override fun videoListRequest(episode: SEpisode): Request =
+ GET("$apiUrl/episode.php?id=${episode.url}", headers)
+
+ override fun videoListParse(response: Response): List