diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini
index 586c924c4a..20b2db7179 100644
--- a/custom/conf/app.example.ini
+++ b/custom/conf/app.example.ini
@@ -1996,7 +1996,7 @@ PATH =
 ;[mirror]
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Enables the mirror functionality. Set to **false** to disable all mirrors.
+;; Enables the mirror functionality. Set to **false** to disable all mirrors (pre-existing mirrors remain valid but won't be updated; may be converted to regular repo).
 ;ENABLED = true
 ;; Disable the creation of **new** pull mirrors. Pre-existing mirrors remain valid. Will be ignored if `mirror.ENABLED` is `false`.
 ;DISABLE_NEW_PULL = false
diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md
index 6cbc9b91f9..c92a518d9f 100644
--- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md
+++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md
@@ -1061,7 +1061,7 @@ Task queue configuration has been moved to `queue.task`. However, the below conf
 
 ## Mirror (`mirror`)
 
-- `ENABLED`: **true**: Enables the mirror functionality. Set to **false** to disable all mirrors.
+- `ENABLED`: **true**: Enables the mirror functionality. Set to **false** to disable all mirrors (pre-existing mirrors remain valid but won't be updated; may be converted to regular repo).
 - `DISABLE_NEW_PULL`: **false**: Disable the creation of **new** pull mirrors. Pre-existing mirrors remain valid. Will be ignored if `mirror.ENABLED` is `false`.
 - `DISABLE_NEW_PUSH`: **false**: Disable the creation of **new** push mirrors. Pre-existing mirrors remain valid. Will be ignored if `mirror.ENABLED` is `false`.
 - `DEFAULT_INTERVAL`: **8h**: Default interval between each check
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index d8398f6d9f..fd8b162762 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -908,7 +908,6 @@ need_auth = Authorization
 migrate_options = Migration Options
 migrate_service = Migration Service
 migrate_options_mirror_helper = This repository will be a <span class="text blue">mirror</span>
-migrate_options_mirror_disabled = Your site administrator has disabled new mirrors.
 migrate_options_lfs = Migrate LFS files
 migrate_options_lfs_endpoint.label = LFS Endpoint
 migrate_options_lfs_endpoint.description = Migration will attempt to use your Git remote to <a target="_blank" rel="noopener noreferrer" href="%s">determine the LFS server</a>. You can also specify a custom endpoint if the repository LFS data is stored somewhere else.
diff --git a/routers/web/user/home.go b/routers/web/user/home.go
index 367cf5ca08..f43fd38bf2 100644
--- a/routers/web/user/home.go
+++ b/routers/web/user/home.go
@@ -77,6 +77,7 @@ func Dashboard(ctx *context.Context) {
 	ctx.Data["PageIsNews"] = true
 	cnt, _ := models.GetOrganizationCount(db.DefaultContext, ctxUser)
 	ctx.Data["UserOrgsCount"] = cnt
+	ctx.Data["DisableNewPullMirrors"] = setting.Mirror.DisableNewPull
 
 	var uid int64
 	if ctxUser != nil {
diff --git a/services/cron/tasks_basic.go b/services/cron/tasks_basic.go
index fdf8550c31..b4a549d636 100644
--- a/services/cron/tasks_basic.go
+++ b/services/cron/tasks_basic.go
@@ -141,7 +141,9 @@ func registerCleanupHookTaskTable() {
 }
 
 func initBasicTasks() {
-	registerUpdateMirrorTask()
+	if setting.Mirror.Enabled {
+		registerUpdateMirrorTask()
+	}
 	registerRepoHealthCheck()
 	registerCheckRepoStats()
 	registerArchiveCleanup()
diff --git a/templates/repo/migrate/options.tmpl b/templates/repo/migrate/options.tmpl
index 8aefaf68f1..2c3e42352c 100644
--- a/templates/repo/migrate/options.tmpl
+++ b/templates/repo/migrate/options.tmpl
@@ -1,13 +1,8 @@
-<div class="inline field">
+<div class="inline field" {{if .DisableNewPullMirrors}} hidden{{end}}>
 	<label>{{.i18n.Tr "repo.migrate_options"}}</label>
 	<div class="ui checkbox">
-		{{if .DisableNewPullMirrors}}
-			<input id="mirror" name="mirror" type="checkbox" readonly>
-			<label>{{.i18n.Tr "repo.migrate_options_mirror_disabled"}}</label>
-		{{else}}
-			<input id="mirror" name="mirror" type="checkbox" {{if .mirror}} checked{{end}}>
-			<label>{{.i18n.Tr "repo.migrate_options_mirror_helper" | Safe}}</label>
-		{{end}}
+		<input id="mirror" name="mirror" type="checkbox" {{if and .mirror (not .DisableNewPullMirrors)}} checked{{end}}>
+		<label>{{.i18n.Tr "repo.migrate_options_mirror_helper" | Safe}}</label>
 	</div>
 </div>
 {{if .LFSActive}}
diff --git a/templates/user/dashboard/repolist.tmpl b/templates/user/dashboard/repolist.tmpl
index 41230d3287..4fed37d5e1 100644
--- a/templates/user/dashboard/repolist.tmpl
+++ b/templates/user/dashboard/repolist.tmpl
@@ -109,10 +109,12 @@
 						{{.i18n.Tr "forks"}}
 						<div v-show="reposFilter === 'forks'" class="ui circular mini grey label">${repoTypeCount}</div>
 					</a>
+					{{if not .DisableNewPullMirrors}}
 					<a class="item" :class="{active: reposFilter === 'mirrors'}" @click="changeReposFilter('mirrors')">
 						{{.i18n.Tr "mirrors"}}
 						<div v-show="reposFilter === 'mirrors'" class="ui circular mini grey label">${repoTypeCount}</div>
 					</a>
+					{{end}}
 					<a class="item" :class="{active: reposFilter === 'collaborative'}" @click="changeReposFilter('collaborative')">
 						{{.i18n.Tr "collaborative"}}
 						<div v-show="reposFilter === 'collaborative'" class="ui circular mini grey label">${repoTypeCount}</div>