diff --git a/src/es/pelisflix/AndroidManifest.xml b/src/es/pelisflix/AndroidManifest.xml
new file mode 100644
index 000000000..acb4de356
--- /dev/null
+++ b/src/es/pelisflix/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/src/es/pelisflix/build.gradle b/src/es/pelisflix/build.gradle
new file mode 100644
index 000000000..6ea3d17eb
--- /dev/null
+++ b/src/es/pelisflix/build.gradle
@@ -0,0 +1,12 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+
+ext {
+ extName = 'Pelisflix'
+ pkgNameSuffix = 'es.pelisflix'
+ extClass = '.PelisflixFactory'
+ extVersionCode = 1
+ libVersion = '13'
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/es/pelisflix/res/mipmap-hdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..730e76561
Binary files /dev/null and b/src/es/pelisflix/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/es/pelisflix/res/mipmap-mdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..9ec7dbb53
Binary files /dev/null and b/src/es/pelisflix/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/es/pelisflix/res/mipmap-xhdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..0e9c48dc1
Binary files /dev/null and b/src/es/pelisflix/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/es/pelisflix/res/mipmap-xxhdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..cf6db2adb
Binary files /dev/null and b/src/es/pelisflix/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/es/pelisflix/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..b30b86d6c
Binary files /dev/null and b/src/es/pelisflix/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/es/pelisflix/src/eu/kanade/tachiyomi/animeextension/es/pelisflix/Pelisflix.kt b/src/es/pelisflix/src/eu/kanade/tachiyomi/animeextension/es/pelisflix/Pelisflix.kt
new file mode 100644
index 000000000..aca6b7dc0
--- /dev/null
+++ b/src/es/pelisflix/src/eu/kanade/tachiyomi/animeextension/es/pelisflix/Pelisflix.kt
@@ -0,0 +1,285 @@
+package eu.kanade.tachiyomi.animeextension.es.pelisflix
+
+import android.app.Application
+import android.content.SharedPreferences
+import android.util.Base64
+import androidx.preference.ListPreference
+import androidx.preference.PreferenceScreen
+import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
+import eu.kanade.tachiyomi.animesource.model.AnimeFilter
+import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
+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.ParsedAnimeHttpSource
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.serialization.json.Json
+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 uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+import uy.kohesive.injekt.injectLazy
+import java.io.IOException
+import java.lang.Exception
+
+open class Pelisflix(override val name: String, override val baseUrl: String) : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
+
+ override val lang = "es"
+
+ override val supportsLatest = false
+
+ override val client: OkHttpClient = network.cloudflareClient
+
+ private val json: Json by injectLazy()
+
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/peliculas-online/page/$page")
+
+ override fun popularAnimeSelector(): String = "#Tf-Wp div.TpRwCont ul.MovieList li.TPostMv article.TPost"
+
+ override fun popularAnimeFromElement(element: Element): SAnime {
+ val anime = SAnime.create()
+ anime.setUrlWithoutDomain(element.select("a").attr("href"))
+ anime.title = element.select("a h2.Title").text()
+ anime.thumbnail_url = externalOrInternalImg(element.selectFirst("a div.Image figure.Objf img.imglazy").attr("data-src"))
+ anime.description = element.select("div.TPMvCn div.Description p:nth-child(1)").text().removeSurrounding("\"")
+ return anime
+ }
+
+ override fun popularAnimeNextPageSelector(): String = "nav.wp-pagenavi div.nav-links a ~ a"
+
+ override fun episodeListParse(response: Response): List {
+ val document = response.asJsoup()
+ val episodeList = mutableListOf()
+ val movie = document.select("ul.optnslst li div[data-url]")
+ val seasons = document.select("main .SeasonBx a")
+ if (movie.any()) {
+ val movieEp = SEpisode.create()
+ movieEp.name = "Pelicula"
+ movieEp.episode_number = 1f
+ movieEp.setUrlWithoutDomain(response.request.url.toString())
+ episodeList.add(movieEp)
+ } else if (seasons.any()) {
+ val seasonEp = extractEpisodesFromSeasons(seasons)
+ if (seasonEp.isNotEmpty()) episodeList.addAll(seasonEp)
+ }
+ return episodeList.reversed()
+ }
+
+ private fun extractEpisodesFromSeasons(seasons: Elements): List {
+ val episodeList = mutableListOf()
+ var noEp = 1f
+ var noTemp = 1
+ seasons!!.forEach {
+ var request = client.newCall(GET(it!!.attr("href"))).execute()
+ if (request.isSuccessful) {
+ val document = request.asJsoup()
+ document.select("div.TPTblCn table tbody tr.Viewed")!!.forEach { epContainer ->
+ val urlEp = epContainer.selectFirst("td.MvTbPly > a").attr("href")
+ val ep = SEpisode.create()
+ ep.name = "T$noTemp - Episodio $noEp"
+ ep.episode_number = noEp
+ ep.setUrlWithoutDomain(urlEp)
+ episodeList.add(ep)
+ noEp++
+ }
+ }
+ noTemp++
+ }
+ return episodeList
+ }
+
+ override fun episodeListSelector() = "uwu"
+
+ override fun episodeFromElement(element: Element) = throw Exception("not used")
+
+ override fun videoListParse(response: Response): List