diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d24d15642..c10bdc580 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -150,6 +150,10 @@
             android:name=".extension.util.ExtensionInstallActivity"
             android:theme="@android:style/Theme.Translucent.NoTitleBar" />
 
+        <activity
+            android:name="exh.ui.login.EhLoginActivity"
+            android:label="EHentaiLogin" />
+
         <provider
             android:name="androidx.core.content.FileProvider"
             android:authorities="${applicationId}.provider"
diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt
index aa09e41a4..8d93c305d 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt
@@ -40,7 +40,7 @@ import exh.metadata.metadata.EHentaiSearchMetadata.Companion.TAG_TYPE_WEAK
 import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.TAG_TYPE_VIRTUAL
 import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.toGenreString
 import exh.metadata.metadata.base.RaisedTag
-import exh.ui.login.LoginController
+import exh.ui.login.EhLoginActivity
 import exh.ui.metadata.adapters.EHentaiDescriptionAdapter
 import exh.util.UriFilter
 import exh.util.UriGroup
@@ -725,9 +725,9 @@ class EHentai(
     private fun rawCookies(sp: Int): Map<String, String> {
         val cookies: MutableMap<String, String> = mutableMapOf()
         if (preferences.enableExhentai().get()) {
-            cookies[LoginController.MEMBER_ID_COOKIE] = preferences.memberIdVal().get()
-            cookies[LoginController.PASS_HASH_COOKIE] = preferences.passHashVal().get()
-            cookies[LoginController.IGNEOUS_COOKIE] = preferences.igneousVal().get()
+            cookies[EhLoginActivity.MEMBER_ID_COOKIE] = preferences.memberIdVal().get()
+            cookies[EhLoginActivity.PASS_HASH_COOKIE] = preferences.passHashVal().get()
+            cookies[EhLoginActivity.IGNEOUS_COOKIE] = preferences.igneousVal().get()
             cookies["sp"] = sp.toString()
 
             val sessionKey = preferences.exhSettingsKey().get()
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt
index d1d4f77c0..64e1e4b18 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt
@@ -1,6 +1,8 @@
 package eu.kanade.tachiyomi.ui.setting
 
+import android.app.Activity
 import android.content.Context
+import android.content.Intent
 import android.os.Handler
 import android.text.InputType
 import android.widget.Toast
@@ -19,7 +21,6 @@ import eu.kanade.tachiyomi.data.preference.PreferenceKeys
 import eu.kanade.tachiyomi.data.preference.asImmediateFlow
 import eu.kanade.tachiyomi.databinding.EhDialogCategoriesBinding
 import eu.kanade.tachiyomi.databinding.EhDialogLanguagesBinding
-import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 import eu.kanade.tachiyomi.ui.webview.WebViewActivity
 import eu.kanade.tachiyomi.util.preference.defaultValue
 import eu.kanade.tachiyomi.util.preference.entriesRes
@@ -43,7 +44,7 @@ import exh.metadata.metadata.EHentaiSearchMetadata
 import exh.metadata.metadata.base.getFlatMetadataForManga
 import exh.source.isEhBasedManga
 import exh.uconfig.WarnConfigureDialogController
-import exh.ui.login.LoginController
+import exh.ui.login.EhLoginActivity
 import exh.util.executeOnIO
 import exh.util.floor
 import exh.util.nullIfBlank
@@ -111,7 +112,7 @@ class SettingsEhController : SettingsController() {
                         preferences.enableExhentai().set(false)
                         true
                     } else {
-                        router.pushController(LoginController().withFadeTransaction())
+                        startActivityForResult(EhLoginActivity.newIntent(activity!!), LOGIN_RESULT)
                         false
                     }
                 }
@@ -751,4 +752,17 @@ class SettingsEhController : SettingsController() {
     }
 
     data class RelativeTime(var years: Int? = null, var months: Int? = null, var weeks: Int? = null, var days: Int? = null, var hours: Int? = null, var minutes: Int? = null, var seconds: Int? = null, var milliseconds: Int? = null)
+
+    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+        if (resultCode == Activity.RESULT_OK) {
+            if (requestCode == LOGIN_RESULT) {
+                // Upload settings
+                WarnConfigureDialogController.uploadSettings(router)
+            }
+        }
+    }
+
+    companion object {
+        const val LOGIN_RESULT = 500
+    }
 }
diff --git a/app/src/main/java/exh/ui/login/LoginController.kt b/app/src/main/java/exh/ui/login/EhLoginActivity.kt
old mode 100755
new mode 100644
similarity index 68%
rename from app/src/main/java/exh/ui/login/LoginController.kt
rename to app/src/main/java/exh/ui/login/EhLoginActivity.kt
index 5f4c151d7..105b61784
--- a/app/src/main/java/exh/ui/login/LoginController.kt
+++ b/app/src/main/java/exh/ui/login/EhLoginActivity.kt
@@ -1,21 +1,32 @@
 package exh.ui.login
 
+import android.content.Context
+import android.content.Intent
+import android.content.pm.ApplicationInfo
 import android.net.Uri
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
+import android.os.Bundle
 import android.webkit.CookieManager
+import android.webkit.WebChromeClient
 import android.webkit.WebView
 import android.webkit.WebViewClient
+import android.widget.Toast
+import androidx.core.view.isInvisible
 import androidx.core.view.isVisible
+import androidx.lifecycle.lifecycleScope
+import eu.kanade.tachiyomi.BuildConfig
+import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 import eu.kanade.tachiyomi.databinding.EhActivityLoginBinding
 import eu.kanade.tachiyomi.source.SourceManager
-import eu.kanade.tachiyomi.ui.base.controller.NucleusController
+import eu.kanade.tachiyomi.ui.base.activity.BaseViewBindingActivity
 import eu.kanade.tachiyomi.util.lang.launchUI
+import eu.kanade.tachiyomi.util.system.WebViewUtil
 import eu.kanade.tachiyomi.util.system.setDefaultSettings
+import eu.kanade.tachiyomi.util.system.toast
 import exh.log.xLogD
-import exh.uconfig.WarnConfigureDialogController
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import reactivecircus.flowbinding.appcompat.navigationClicks
 import uy.kohesive.injekt.injectLazy
 import java.net.HttpCookie
 import java.util.Locale
@@ -24,24 +35,72 @@ import java.util.Locale
  * LoginController
  */
 
-class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter>() {
+class EhLoginActivity : BaseViewBindingActivity<EhActivityLoginBinding>() {
     val preferenceManager: PreferencesHelper by injectLazy()
 
     val sourceManager: SourceManager by injectLazy()
 
-    override fun getTitle() = "ExHentai login"
+    private var bundle: Bundle? = null
 
-    override fun createPresenter() = LoginPresenter()
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
 
-    override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
-        binding = EhActivityLoginBinding.inflate(inflater)
-        return binding.root
+        if (!WebViewUtil.supportsWebView(this)) {
+            toast(R.string.information_webview_required, Toast.LENGTH_LONG)
+            finish()
+            return
+        }
+
+        try {
+            binding = EhActivityLoginBinding.inflate(layoutInflater)
+            setContentView(binding.root)
+        } catch (e: Throwable) {
+            // Potentially throws errors like "Error inflating class android.webkit.WebView"
+            toast(R.string.information_webview_required, Toast.LENGTH_LONG)
+            finish()
+            return
+        }
+
+        title = "ExHentai login"
+
+        setSupportActionBar(binding.toolbar)
+        supportActionBar?.setDisplayHomeAsUpEnabled(true)
+
+        binding.toolbar.navigationClicks()
+            .onEach { finish() }
+            .launchIn(lifecycleScope)
+
+        onViewCreated()
+
+        if (bundle == null) {
+            binding.webview.setDefaultSettings()
+
+            // Debug mode (chrome://inspect/#devices)
+            if (BuildConfig.DEBUG && 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) {
+                WebView.setWebContentsDebuggingEnabled(true)
+            }
+
+            binding.webview.webChromeClient = object : WebChromeClient() {
+                override fun onProgressChanged(view: WebView?, newProgress: Int) {
+                    binding.progressBar.isVisible = true
+                    binding.progressBar.progress = newProgress
+                    if (newProgress == 100) {
+                        binding.progressBar.isInvisible = true
+                    }
+                    super.onProgressChanged(view, newProgress)
+                }
+            }
+        } else {
+            binding.webview.restoreState(bundle)
+        }
+
+        if (bundle == null) {
+            startWebview()
+        }
     }
 
-    override fun onViewCreated(view: View) {
-        super.onViewCreated(view)
-
-        binding.btnCancel.setOnClickListener { router.popCurrentController() }
+    fun onViewCreated() {
+        binding.btnCancel.setOnClickListener { finish() }
 
         binding.btnAdvanced.setOnClickListener {
             binding.advancedOptions.isVisible = true
@@ -71,7 +130,9 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
 
         CookieManager.getInstance().removeAllCookies {
             launchUI {
-                startWebview()
+                if (bundle == null) {
+                    startWebview()
+                }
             }
         }
     }
@@ -107,18 +168,17 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
                     // At ExHentai, check that everything worked out...
                     if (applyExHentaiCookies(url)) {
                         preferenceManager.enableExhentai().set(true)
-                        finishLogin()
+                        setResult(RESULT_OK)
+                        finish()
                     }
                 }
             }
         }
     }
 
-    fun finishLogin() {
-        router.popCurrentController()
-
-        // Upload settings
-        WarnConfigureDialogController.uploadSettings(router)
+    override fun onDestroy() {
+        binding.webview?.destroy()
+        super.onDestroy()
     }
 
     /**
@@ -216,5 +276,11 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
                         if(pc != null) pc.style.color = "#26353F";
                     })()
                     """
+
+        fun newIntent(context: Context): Intent {
+            return Intent(context, EhLoginActivity::class.java).apply {
+                addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+            }
+        }
     }
 }
diff --git a/app/src/main/java/exh/ui/login/LoginPresenter.kt b/app/src/main/java/exh/ui/login/LoginPresenter.kt
deleted file mode 100644
index 6966341c7..000000000
--- a/app/src/main/java/exh/ui/login/LoginPresenter.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package exh.ui.login
-
-import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
-
-class LoginPresenter : BasePresenter<LoginController>()
diff --git a/app/src/main/res/layout/eh_activity_login.xml b/app/src/main/res/layout/eh_activity_login.xml
index ac9dbb5c8..2bc0bbb67 100755
--- a/app/src/main/res/layout/eh_activity_login.xml
+++ b/app/src/main/res/layout/eh_activity_login.xml
@@ -13,9 +13,20 @@
         <com.google.android.material.appbar.AppBarLayout
             android:id="@+id/appbar"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content" />
+            android:layout_height="wrap_content" >
+
+            <com.google.android.material.appbar.MaterialToolbar
+                android:id="@+id/toolbar"
+                android:layout_width="match_parent"
+                android:layout_height="?attr/actionBarSize"
+                android:background="?attr/colorPrimary"
+                android:theme="?attr/actionBarTheme"
+                app:navigationIcon="@drawable/ic_close_24dp" />
+
+        </com.google.android.material.appbar.AppBarLayout>
 
         <androidx.constraintlayout.widget.ConstraintLayout
+
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:animateLayoutChanges="true">
@@ -89,7 +100,13 @@
                 app:layout_constraintBottom_toTopOf="@+id/linearLayout"
                 app:layout_constraintLeft_toLeftOf="parent"
                 app:layout_constraintRight_toRightOf="parent"
-                app:layout_constraintTop_toTopOf="parent" />
+                app:layout_constraintTop_toTopOf="parent" >
+
+                <com.google.android.material.progressindicator.LinearProgressIndicator
+                    android:id="@+id/progress_bar"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content" />
+            </WebView>
 
             <LinearLayout
                 android:id="@+id/linearLayout"