diff --git a/src/en/animeowl/build.gradle b/src/en/animeowl/build.gradle
index e5849d46..40b4fa1d 100644
--- a/src/en/animeowl/build.gradle
+++ b/src/en/animeowl/build.gradle
@@ -1,7 +1,7 @@
 ext {
     extName = 'AnimeOwl'
     extClass = '.AnimeOwl'
-    extVersionCode = 22
+    extVersionCode = 23
 }
 
 apply from: "$rootDir/common.gradle"
diff --git a/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/AnimeOwl.kt b/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/AnimeOwl.kt
index b53606e8..3b061288 100644
--- a/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/AnimeOwl.kt
+++ b/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/AnimeOwl.kt
@@ -129,20 +129,20 @@ class AnimeOwl : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
         val document = response.asJsoup()
         val sub = document.select("#anime-cover-sub-content .episode-node").mapIndexed { idx, it ->
             EpisodeResponse.Episode(
-                id = it.text().toDouble(),
+                id = it.attr("title").toDoubleOrNull(),
                 episodeIndex = idx.toString(),
-                name = it.text(),
+                name = it.attr("title"),
                 lang = "Sub",
-                href = it.attr("abs:href"),
+                href = it.absUrl("href"),
             )
         }
         val dub = document.select("#anime-cover-dub-content .episode-node").mapIndexed { idx, it ->
             EpisodeResponse.Episode(
-                id = it.text().toDouble(),
+                id = it.attr("title").toDoubleOrNull(),
                 episodeIndex = idx.toString(),
-                name = it.text(),
+                name = it.attr("title"),
                 lang = "Dub",
-                href = it.attr("abs:href"),
+                href = it.absUrl("href"),
             )
         }
 
diff --git a/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/AnimeOwlDto.kt b/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/AnimeOwlDto.kt
index 0e39f027..66ae5673 100644
--- a/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/AnimeOwlDto.kt
+++ b/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/AnimeOwlDto.kt
@@ -53,12 +53,13 @@ data class Link(
 
 @Serializable
 data class OwlServers(
-    val kaido: String? = null,
-    val luffy: String? = null,
-    val zoro: String? = null,
+    val kaido: List<Stream>? = null,
+    val luffy: List<Stream>? = null,
+    val zoro: List<Stream>? = null,
 )
 
 @Serializable
 data class Stream(
     val url: String,
+    val resolution: String?,
 )
diff --git a/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/extractors/OwlExtractor.kt b/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/extractors/OwlExtractor.kt
index e3fa8ef1..3d4c22a9 100644
--- a/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/extractors/OwlExtractor.kt
+++ b/src/en/animeowl/src/eu/kanade/tachiyomi/animeextension/en/animeowl/extractors/OwlExtractor.kt
@@ -45,23 +45,32 @@ class OwlExtractor(private val client: OkHttpClient, private val baseUrl: String
         coroutineScope {
             val lufDeferred = async {
                 servers.luffy?.let { luffy ->
-                    noRedirectClient.newCall(GET("${luffy}$jwt")).execute()
-                        .use { it.headers["Location"] }
-                        ?.let { videoList.add(Video(it, "${link.lang} Luffy:1080p", it)) }
+                    luffy.forEach { stream ->
+                        noRedirectClient.newCall(GET("${stream.url}$jwt")).execute()
+                            .use { it.headers["Location"] }?.let {
+                                videoList.add(
+                                    Video(it, "${link.lang} Luffy:${stream.resolution}", it),
+                                )
+                            }
+                    }
                 }
             }
             val kaiDeferred = async {
-                servers.kaido?.let {
-                    videoList.addAll(
-                        getHLS("${it}$jwt", "Kaido", link.lang),
-                    )
+                servers.kaido?.let { kaido ->
+                    kaido.forEach { stream ->
+                        videoList.addAll(
+                            getHLS("${stream.url}$jwt", "Kaido", link.lang),
+                        )
+                    }
                 }
             }
             val zorDeferred = async {
-                servers.zoro?.let {
-                    videoList.addAll(
-                        getHLS("${it}$jwt", "Boa", link.lang),
-                    )
+                servers.zoro?.let { zoro ->
+                    zoro.forEach { stream ->
+                        videoList.addAll(
+                            getHLS("${stream.url}$jwt", "Boa", link.lang),
+                        )
+                    }
                 }
             }
 
@@ -71,7 +80,7 @@ class OwlExtractor(private val client: OkHttpClient, private val baseUrl: String
     }
 
     private fun getHLS(url: String, server: String, lang: String): List<Video> {
-        return client.newCall(GET(url)).execute().let {
+        return client.newCall(GET(url)).execute().let { it ->
             if (it.isSuccessful) {
                 it.parseAs<Stream>().url.let {
                     playlistUtils.extractFromHls(it, videoNameGen = { qty -> "$lang $server:$qty" })