about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--.gitea/issue_template/bug.md3
-rw-r--r--.gitea/issue_template/feature.md3
-rw-r--r--README.md5
-rw-r--r--package.json5
-rw-r--r--src/assets/images/imgur.png (renamed from src/assets/images/imgur-icon.png)bin26675 -> 26675 bytes
-rw-r--r--src/assets/javascripts/general.js1
-rw-r--r--src/assets/javascripts/imdb.js52
-rw-r--r--src/assets/javascripts/imgur.js56
-rw-r--r--src/assets/javascripts/instagram.js50
-rw-r--r--src/assets/javascripts/lbry.js56
-rw-r--r--src/assets/javascripts/maps.js52
-rw-r--r--src/assets/javascripts/medium.js17
-rw-r--r--src/assets/javascripts/peertube.js17
-rw-r--r--src/assets/javascripts/quora.js54
-rw-r--r--src/assets/javascripts/reddit.js90
-rw-r--r--src/assets/javascripts/reuters.js54
-rw-r--r--src/assets/javascripts/search.js184
-rw-r--r--src/assets/javascripts/sendTargets.js17
-rw-r--r--src/assets/javascripts/tiktok.js78
-rw-r--r--src/assets/javascripts/translate/translate.js95
-rw-r--r--src/assets/javascripts/twitter.js50
-rw-r--r--src/assets/javascripts/utils.js127
-rw-r--r--src/assets/javascripts/wikipedia.js40
-rw-r--r--src/assets/javascripts/youtube/youtube.js108
-rw-r--r--src/assets/javascripts/youtubeMusic.js30
-rw-r--r--src/instances/beatbump.json5
-rw-r--r--src/instances/blacklist.json27
-rw-r--r--src/instances/data.json26
-rw-r--r--src/instances/get_instances.py19
-rw-r--r--src/pages/background/background.js51
-rw-r--r--src/pages/background/incognito.html35
-rw-r--r--src/pages/background/incognito.js22
-rw-r--r--src/pages/options/index.html17
-rw-r--r--src/pages/options/index.pug2
-rw-r--r--src/pages/options/widgets/general.js39
-rw-r--r--src/pages/options/widgets/general.pug10
-rw-r--r--src/pages/popup/popup.html4
-rw-r--r--src/pages/popup/popup.pug2
-rw-r--r--src/pages/widgets/links.pug6
39 files changed, 620 insertions, 889 deletions
diff --git a/.gitea/issue_template/bug.md b/.gitea/issue_template/bug.md
index 13de17e6..3dfb0b73 100644
--- a/.gitea/issue_template/bug.md
+++ b/.gitea/issue_template/bug.md
@@ -28,4 +28,5 @@ Libredirect version:
 
 <br>
 <!--Put an "x" inbetween the brackets to confirm-->
-[ ] I have checked on codeberg and github and can confirm this issue is not a duplicate.
+
+- [ ] I have checked on codeberg and github and can confirm this issue is not a duplicate.
diff --git a/.gitea/issue_template/feature.md b/.gitea/issue_template/feature.md
index 2b08ce22..6993b6d4 100644
--- a/.gitea/issue_template/feature.md
+++ b/.gitea/issue_template/feature.md
@@ -11,4 +11,5 @@ labels:
 
 <br>
 <!--Put an "x" inbetween the brackets to confirm-->
-[ ] I have checked on codeberg and github and can confirm this issue is not a duplicate.
+
+- [ ] I have checked on codeberg and github and can confirm this issue is not a duplicate.
diff --git a/README.md b/README.md
index 3b7b91ab..db740eb0 100644
--- a/README.md
+++ b/README.md
@@ -7,9 +7,6 @@ A web extension that redirects YouTube, Twitter, Instagram... requests to altern
 [![LibrePay Badge](https://img.shields.io/liberapay/gives/libredirect?label=Liberapay)](https://liberapay.com/LibRedirect)
 
 [![Firefox Add-on](./img/badge-amo.png)](https://addons.mozilla.org/firefox/addon/libredirect/)&nbsp;
-<a href="https://microsoftedge.microsoft.com/addons/detail/libredirect/aodffkeankebfonljgbcfbbaljopcpdb">
-<img src="./img/badge-ms.png" height=60>
-</a>&nbsp;
 <a href="./chromium.md">
 <img src ="./img/badge-chromium.png" height=60 >
 </a>
@@ -32,7 +29,7 @@ Quora => [Quetre](https://github.com/zyachel/quetre)\
 IMDb => [Libremdb](https://github.com/zyachel/libremdb)\
 PeerTube => [SimpleerTube](https://git.sr.ht/~metalune/simpleweb_peertube)\
 LBRY/Odysee => [Librarian](https://codeberg.org/librarian/librarian), [LBRY Desktop](https://lbry.com/get)\
-Search => [SearXNG](https://github.com/searxng/searxng), [SearX](https://searx.github.io/searx/), [Whoogle](https://benbusby.com/projects/whoogle-search/), [Librex](https://github.com/hnhx/librex/)\
+Search => [SearXNG](https://github.com/searxng/searxng), [SearX](https://searx.github.io/searx/), [Whoogle](https://benbusby.com/projects/whoogle-search/), [LibreX](https://github.com/hnhx/librex/)\
 Translate => [SimplyTranslate](https://git.sr.ht/~metalune/simplytranslate_web), [LingvaTranslate](https://github.com/TheDavidDelta/lingva-translate)\
 Maps => [OpenStreetMap](https://www.openstreetmap.org/), [FacilMap](https://github.com/FacilMap/facilmap)\
 Send Files => [Send](https://gitlab.com/timvisee/send)
diff --git a/package.json b/package.json
index e6214c85..50872aac 100644
--- a/package.json
+++ b/package.json
@@ -22,12 +22,13 @@
 	"bugs": {
 		"url": "https://github.com/LibRedirect/LibRedirect/issues"
 	},
-	"homepage": "https://github.com/LibRedirect/LibRedirect",
+	"homepage": "https://libredirect.github.io",
 	"devDependencies": {
 		"prettier": "2.7.1",
 		"web-ext": "^6.7.0"
 	},
 	"dependencies": {
-		"buffer": "^6.0.3"
+		"buffer": "^6.0.3",
+		"ejs": "^3.1.8"
 	}
 }
diff --git a/src/assets/images/imgur-icon.png b/src/assets/images/imgur.png
index c23a45b2..c23a45b2 100644
--- a/src/assets/images/imgur-icon.png
+++ b/src/assets/images/imgur.png
Binary files differdiff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js
index 0b34c148..a8360bd5 100644
--- a/src/assets/javascripts/general.js
+++ b/src/assets/javascripts/general.js
@@ -32,6 +32,7 @@ async function initDefaults() {
 				firstPartyIsolate: false,
 				protocol: "normal",
 				protocolFallback: true,
+				latencyThreshold: 1000,
 			},
 			() => resolve()
 		)
diff --git a/src/assets/javascripts/imdb.js b/src/assets/javascripts/imdb.js
index 9981f1b9..57368557 100644
--- a/src/assets/javascripts/imdb.js
+++ b/src/assets/javascripts/imdb.js
@@ -17,16 +17,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.libremdb = val
 		libremdbNormalRedirectsChecks = [...redirects.libremdb.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = libremdbNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) libremdbNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			imdbRedirects: redirects,
 			libremdbNormalRedirectsChecks,
+			libremdbTorRedirectsChecks: [...redirects.libremdb.tor],
+			libremdbI2pRedirectsChecks: [...redirects.libremdb.i2p],
+			libremdbLokiRedirectsChecks: [...redirects.libremdb.loki],
 		})
 	})
 }
@@ -172,25 +175,32 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.set(
-					{
-						disableImdb: true,
-						imdbRedirects: redirects,
-
-						libremdbNormalRedirectsChecks: [...redirects.libremdb.normal],
-						libremdbNormalCustomRedirects: [],
-
-						libremdbTorRedirectsChecks: [...redirects.libremdb.tor],
-						libremdbTorCustomRedirects: [],
-
-						libremdbI2pRedirectsChecks: [],
-						libremdbI2pCustomRedirects: [],
-
-						libremdbLokiRedirectsChecks: [],
-						libremdbLokiCustomRedirects: [],
-					},
-					() => resolve()
-				)
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
+					libremdbNormalRedirectsChecks = [...redirects.libremdb.normal]
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = libremdbNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) libremdbNormalRedirectsChecks.splice(a, 1)
+					}
+					browser.storage.local.set(
+						{
+							disableImdb: true,
+							imdbRedirects: redirects,
+
+							libremdbNormalRedirectsChecks,
+							libremdbNormalCustomRedirects: [],
+
+							libremdbTorRedirectsChecks: [...redirects.libremdb.tor],
+							libremdbTorCustomRedirects: [],
+
+							libremdbI2pRedirectsChecks: [],
+							libremdbI2pCustomRedirects: [],
+
+							libremdbLokiRedirectsChecks: [],
+							libremdbLokiCustomRedirects: [],
+						},
+						() => resolve()
+					)
+				})
 			})
 	})
 }
diff --git a/src/assets/javascripts/imgur.js b/src/assets/javascripts/imgur.js
index 9ccd24af..15b9ccac 100644
--- a/src/assets/javascripts/imgur.js
+++ b/src/assets/javascripts/imgur.js
@@ -16,39 +16,21 @@ for (let i = 0; i < frontends.length; i++) {
 	}
 }
 
-function setRedirects() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				redirects.rimgo = dataJson.rimgo
-
-				rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]
-				rimgoTorRedirectsChecks = [...redirects.rimgo.tor]
-				rimgoI2pRedirectsChecks = [...redirects.rimgo.i2p]
-
-				for (const instance of r.cloudflareBlackList) {
-					const a = rimgoNormalRedirectsChecks.indexOf(instance)
-					if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1)
-
-					const b = rimgoTorRedirectsChecks.indexOf(instance)
-					if (b > -1) rimgoTorRedirectsChecks.splice(b, 1)
-
-					const c = rimgoI2pRedirectsChecks.indexOf(instance)
-					if (c > -1) rimgoI2pRedirectsChecks.splice(c, 1)
-				}
-
-				browser.storage.local.set(
-					{
-						imgurRedirects: redirects,
-						rimgoNormalRedirectsChecks,
-						rimgoTorRedirectsChecks,
-						rimgoI2pRedirectsChecks,
-					},
-					() => resolve()
-				)
-			})
+function setRedirects(val) {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
+		redirects.rimgo = val
+		rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+			const a = rimgoNormalRedirectsChecks.indexOf(instance)
+			if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1)
+		}
+		browser.storage.local.set({
+			imgurRedirects: redirects,
+			rimgoNormalRedirectsChecks,
+			rimgoTorRedirectsChecks: [...redirects.rimgo.tor],
+			rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p],
+			rimgoLokiRedirectsChecks: [...redirects.rimgo.loki],
+		})
 	})
 }
 
@@ -195,11 +177,11 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]
-					for (const instance of r.cloudflareBlackList) {
-						const i = rimgoNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) rimgoNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = rimgoNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1)
 					}
 					browser.storage.local.set(
 						{
diff --git a/src/assets/javascripts/instagram.js b/src/assets/javascripts/instagram.js
index 45a27cb2..d0aa07c0 100644
--- a/src/assets/javascripts/instagram.js
+++ b/src/assets/javascripts/instagram.js
@@ -16,16 +16,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", async r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 		redirects.bibliogram = val
 		bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = bibliogramNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			instagramRedirects: redirects,
 			bibliogramNormalRedirectsChecks,
+			bibliogramTorRedirectsChecks: [...redirects.bibliogram.tor],
+			bibliogramI2pRedirectsChecks: [...redirects.bibliogram.i2p],
+			bibliogramLokiRedirectsChecks: [...redirects.bibliogram.loki],
 		})
 	})
 }
@@ -76,6 +79,38 @@ function init() {
 init()
 browser.storage.onChanged.addListener(init)
 
+function initBibliogramPreferences(test, from) {
+	return new Promise(async resolve => {
+		await init()
+		const protocolHost = utils.protocolHost(from)
+		if (
+			![
+				...bibliogramNormalRedirectsChecks,
+				...bibliogramTorRedirectsChecks,
+				...bibliogramNormalCustomRedirects,
+				...bibliogramTorCustomRedirects,
+				...bibliogramI2pCustomRedirects,
+				...bibliogramLokiCustomRedirects,
+			].includes(protocolHost)
+		) {
+			resolve()
+			return
+		}
+
+		if (!test) {
+			let checkedInstances = []
+			if (protocol == "loki") checkedInstances = [...bibliogramLokiCustomRedirects]
+			else if (protocol == "i2p") checkedInstances = [...bibliogramI2pCustomRedirects]
+			else if (protocol == "tor") checkedInstances = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]
+			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
+				checkedInstances = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]
+			}
+			await utils.getPreferencesFromToken("bibliogram", from, checkedInstances, "settings", "settings.json")
+		}
+		resolve(true)
+	})
+}
+
 function all() {
 	return [
 		...bibliogramNormalRedirectsChecks,
@@ -171,17 +206,17 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]
-					for (const instance of r.cloudflareBlackList) {
-						const i = bibliogramNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) bibliogramNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = bibliogramNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1)
 					}
 					browser.storage.local.set({
 						disableInstagram: false,
 						instagramRedirects: redirects,
 
-						bibliogramNormalRedirectsChecks: bibliogramNormalRedirectsChecks,
+						bibliogramNormalRedirectsChecks,
 						bibliogramNormalCustomRedirects: [],
 
 						bibliogramTorRedirectsChecks: [...redirects.bibliogram.tor],
@@ -201,6 +236,7 @@ function initDefaults() {
 
 export default {
 	setRedirects,
+	initBibliogramPreferences,
 	reverse,
 	redirect,
 	initDefaults,
diff --git a/src/assets/javascripts/lbry.js b/src/assets/javascripts/lbry.js
index 0c4d34cc..5e285ada 100644
--- a/src/assets/javascripts/lbry.js
+++ b/src/assets/javascripts/lbry.js
@@ -17,16 +17,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.librarian = val
 		librarianNormalRedirectsChecks = [...redirects.librarian.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = librarianNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) librarianNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			lbryTargetsRedirects: redirects,
 			librarianNormalRedirectsChecks,
+			librarianTorRedirectsChecks: [...redirects.librarian.tor],
+			librarianI2pRedirectsChecks: [...redirects.librarian.i2p],
+			librarianLokiRedirectsChecks: [...redirects.librarian.loki],
 		})
 	})
 }
@@ -175,27 +178,34 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.set(
-					{
-						disableLbryTargets: true,
-						lbryFrontend: "librarian",
-						lbryTargetsRedirects: redirects,
-						lbryRedirectType: "both",
-
-						librarianNormalRedirectsChecks: [...redirects.librarian.normal],
-						librarianNormalCustomRedirects: [],
-
-						librarianTorRedirectsChecks: [...redirects.librarian.tor],
-						librarianTorCustomRedirects: [],
-
-						librarianI2pRedirectsChecks: [...redirects.librarian.i2p],
-						librarianI2pCustomRedirects: [],
-
-						librarianLokiRedirectsChecks: [...redirects.librarian.loki],
-						librarianLokiCustomRedirects: [],
-					},
-					() => resolve()
-				)
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
+					librarianNormalRedirectsChecks = [...redirects.librarian.normal]
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = librarianNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) librarianNormalRedirectsChecks.splice(a, 1)
+					}
+					browser.storage.local.set(
+						{
+							disableLbryTargets: true,
+							lbryFrontend: "librarian",
+							lbryTargetsRedirects: redirects,
+							lbryRedirectType: "both",
+
+							librarianNormalRedirectsChecks,
+							librarianNormalCustomRedirects: [],
+
+							librarianTorRedirectsChecks: [...redirects.librarian.tor],
+							librarianTorCustomRedirects: [],
+
+							librarianI2pRedirectsChecks: [...redirects.librarian.i2p],
+							librarianI2pCustomRedirects: [],
+
+							librarianLokiRedirectsChecks: [...redirects.librarian.loki],
+							librarianLokiCustomRedirects: [],
+						},
+						() => resolve()
+					)
+				})
 			})
 	})
 }
diff --git a/src/assets/javascripts/maps.js b/src/assets/javascripts/maps.js
index 9fb10b9d..6e3c9af0 100644
--- a/src/assets/javascripts/maps.js
+++ b/src/assets/javascripts/maps.js
@@ -21,16 +21,19 @@ redirects.osm = {}
 redirects.osm.normal = ["https://www.openstreetmap.org"]
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.facil = val
 		facilNormalRedirectsChecks = [...redirects.facil.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = facilNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) facilNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			mapsRedirects: redirects,
 			facilNormalRedirectsChecks,
+			facilTorRedirectsChecks: [...redirects.facil.tor],
+			facilI2pRedirectsChecks: [...redirects.facil.i2p],
+			facilLokiRedirectsChecks: [...redirects.facil.loki],
 		})
 	})
 }
@@ -264,25 +267,32 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.set(
-					{
-						disableMaps: false,
-						mapsFrontend: "osm",
-						mapsRedirects: redirects,
-						facilNormalRedirectsChecks: [...redirects.facil.normal],
-						facilNormalCustomRedirects: [],
-
-						facilTorRedirectsChecks: [...redirects.facil.tor],
-						facilTorCustomRedirects: [],
-
-						facilI2pRedirectsChecks: [...redirects.facil.i2p],
-						facilI2pCustomRedirects: [],
-
-						facilLokiRedirectsChecks: [...redirects.facil.loki],
-						facilLokiCustomRedirects: [],
-					},
-					() => resolve()
-				)
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
+					facilNormalRedirectsChecks = [...redirects.facil.normal]
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = facilNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) facilNormalRedirectsChecks.splice(a, 1)
+					}
+					browser.storage.local.set(
+						{
+							disableMaps: false,
+							mapsFrontend: "osm",
+							mapsRedirects: redirects,
+							facilNormalRedirectsChecks,
+							facilNormalCustomRedirects: [],
+
+							facilTorRedirectsChecks: [...redirects.facil.tor],
+							facilTorCustomRedirects: [],
+
+							facilI2pRedirectsChecks: [...redirects.facil.i2p],
+							facilI2pCustomRedirects: [],
+
+							facilLokiRedirectsChecks: [...redirects.facil.loki],
+							facilLokiCustomRedirects: [],
+						},
+						() => resolve()
+					)
+				})
 			})
 	})
 }
diff --git a/src/assets/javascripts/medium.js b/src/assets/javascripts/medium.js
index 4c03471c..e5cb1dc4 100644
--- a/src/assets/javascripts/medium.js
+++ b/src/assets/javascripts/medium.js
@@ -40,16 +40,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.scribe = val
 		scribeNormalRedirectsChecks = [...redirects.scribe.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = scribeNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) scribeNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			mediumRedirects: redirects,
 			scribeNormalRedirectsChecks,
+			scribeTorRedirectsChecks: [...redirects.scribe.tor],
+			scribeI2pRedirectsChecks: [...redirects.scribe.i2p],
+			scribeLokiRedirectsChecks: [...redirects.scribe.loki],
 		})
 	})
 }
@@ -181,18 +184,18 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					scribeNormalRedirectsChecks = [...redirects.scribe.normal]
-					for (const instance of r.cloudflareBlackList) {
-						let i = scribeNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) scribeNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = scribeNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) scribeNormalRedirectsChecks.splice(a, 1)
 					}
 					browser.storage.local.set(
 						{
 							disableMedium: false,
 							mediumRedirects: redirects,
 
-							scribeNormalRedirectsChecks: scribeNormalRedirectsChecks,
+							scribeNormalRedirectsChecks,
 							scribeNormalCustomRedirects: [],
 
 							scribeTorRedirectsChecks: [...redirects.scribe.tor],
diff --git a/src/assets/javascripts/peertube.js b/src/assets/javascripts/peertube.js
index de25cfaa..478a18f0 100644
--- a/src/assets/javascripts/peertube.js
+++ b/src/assets/javascripts/peertube.js
@@ -15,16 +15,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.simpleertube = val
 		simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = simpleertubeNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) simpleertubeNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			peertubeRedirects: redirects,
 			simpleertubeNormalRedirectsChecks,
+			simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor],
+			simpleertubeI2pRedirectsChecks: [...redirects.simpleertube.i2p],
+			simpleertubeLokiRedirectsChecks: [...redirects.simpleertube.loki],
 		})
 	})
 }
@@ -162,11 +165,11 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal]
-					for (const instance of r.cloudflareBlackList) {
-						let i = simpleertubeNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) simpleertubeNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = simpleertubeNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) simpleertubeNormalRedirectsChecks.splice(a, 1)
 					}
 					browser.storage.local.set(
 						{
@@ -174,7 +177,7 @@ function initDefaults() {
 							disablePeertubeTargets: true,
 							peertubeRedirects: redirects,
 
-							simpleertubeNormalRedirectsChecks: simpleertubeNormalRedirectsChecks,
+							simpleertubeNormalRedirectsChecks,
 							simpleertubeNormalCustomRedirects: [],
 
 							simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor],
diff --git a/src/assets/javascripts/quora.js b/src/assets/javascripts/quora.js
index 3f9e4189..578cfe76 100644
--- a/src/assets/javascripts/quora.js
+++ b/src/assets/javascripts/quora.js
@@ -17,16 +17,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.quetre = val
 		quetreNormalRedirectsChecks = [...redirects.quetre.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = quetreNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) quetreNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			quoraRedirects: redirects,
 			quetreNormalRedirectsChecks,
+			quetreTorRedirectsChecks: [...redirects.quetre.tor],
+			quetreI2pRedirectsChecks: [...redirects.quetre.i2p],
+			quetreLokiRedirectsChecks: [...redirects.quetre.loki],
 		})
 	})
 }
@@ -157,26 +160,33 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.set(
-					{
-						disableQuora: false,
-
-						quoraRedirects: redirects,
-
-						quetreNormalRedirectsChecks: [...redirects.quetre.normal],
-						quetreNormalCustomRedirects: [],
-
-						quetreTorRedirectsChecks: [...redirects.quetre.tor],
-						quetreTorCustomRedirects: [],
-
-						quetreI2pRedirectsChecks: [...redirects.quetre.i2p],
-						quetreI2pCustomRedirects: [],
-
-						quetreLokiRedirectsChecks: [...redirects.quetre.loki],
-						quetreLokiCustomRedirects: [],
-					},
-					() => resolve()
-				)
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
+					quetreNormalRedirectsChecks = [...redirects.quetre.normal]
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = quetreNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) quetreNormalRedirectsChecks.splice(a, 1)
+					}
+					browser.storage.local.set(
+						{
+							disableQuora: false,
+
+							quoraRedirects: redirects,
+
+							quetreNormalRedirectsChecks,
+							quetreNormalCustomRedirects: [],
+
+							quetreTorRedirectsChecks: [...redirects.quetre.tor],
+							quetreTorCustomRedirects: [],
+
+							quetreI2pRedirectsChecks: [...redirects.quetre.i2p],
+							quetreI2pCustomRedirects: [],
+
+							quetreLokiRedirectsChecks: [...redirects.quetre.loki],
+							quetreLokiCustomRedirects: [],
+						},
+						() => resolve()
+					)
+				})
 			})
 	})
 }
diff --git a/src/assets/javascripts/reddit.js b/src/assets/javascripts/reddit.js
index 699dcf1a..ca1993b5 100644
--- a/src/assets/javascripts/reddit.js
+++ b/src/assets/javascripts/reddit.js
@@ -16,11 +16,11 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects = val
 		libredditNormalRedirectsChecks = [...redirects.libreddit.normal]
 		tedditNormalRedirectsChecks = [...redirects.teddit.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = libredditNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) libredditNormalRedirectsChecks.splice(a, 1)
 
@@ -30,7 +30,13 @@ function setRedirects(val) {
 		browser.storage.local.set({
 			redditRedirects: redirects,
 			libredditNormalRedirectsChecks,
+			libredditTorRedirectsChecks: [...redirects.libreddit.tor],
+			libredditI2pRedirectsChecks: [...redirects.libreddit.i2p],
+			libredditLokiRedirectsChecks: [...redirects.libreddit.loki],
 			tedditNormalRedirectsChecks,
+			tedditTorRedirectsChecks: [...redirects.teddit.tor],
+			tedditI2pRedirectsChecks: [...redirects.teddit.i2p],
+			tedditLokiRedirectsChecks: [...redirects.teddit.loki],
 		})
 	})
 }
@@ -145,36 +151,6 @@ function initLibredditCookies(test, from) {
 	})
 }
 
-function pasteLibredditCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableReddit || redditFrontend != "libreddit" || protocol === undefined) {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...libredditLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...libredditI2pCustomRedirects]
-		else if (protocol == "tor") checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "theme")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "front_page")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "layout")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "wide")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "post_sort")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "comment_sort")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "show_nsfw")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "autoplay_videos")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "use_hls")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "hide_hls_notification")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "subscriptions")
-		utils.getCookiesFromStorage("libreddit", checkedInstances, "filters")
-		resolve()
-	})
-}
-
 function initTedditCookies(test, from) {
 	return new Promise(async resolve => {
 		await init()
@@ -211,36 +187,6 @@ function initTedditCookies(test, from) {
 	})
 }
 
-function pasteTedditCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableReddit || redditFrontend != "teddit" || protocol === undefined) {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...tedditLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...tedditI2pCustomRedirects]
-		else if (protocol == "tor") checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("teddit", checkedInstances, "collapse_child_comments")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "domain_instagram")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "domain_twitter")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "domain_youtube")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "flairs")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "highlight_controversial")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "nsfw_enabled")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "post_media_max_height")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "show_upvoted_percentage")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "show_upvotes")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "theme")
-		utils.getCookiesFromStorage("teddit", checkedInstances, "videos_muted")
-		resolve()
-	})
-}
-
 function all() {
 	return [
 		...redditRedirects.libreddit.normal,
@@ -390,17 +336,15 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					libredditNormalRedirectsChecks = [...redirects.libreddit.normal]
 					tedditNormalRedirectsChecks = [...redirects.teddit.normal]
-					for (const instance of r.cloudflareBlackList) {
-						let i
-
-						i = libredditNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) libredditNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = libredditNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) libredditNormalRedirectsChecks.splice(a, 1)
 
-						i = tedditNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) tedditNormalRedirectsChecks.splice(i, 1)
+						const b = tedditNormalRedirectsChecks.indexOf(instance)
+						if (b > -1) tedditNormalRedirectsChecks.splice(b, 1)
 					}
 					browser.storage.local.set(
 						{
@@ -408,7 +352,7 @@ function initDefaults() {
 							redditFrontend: "libreddit",
 							redditRedirects: redirects,
 
-							libredditNormalRedirectsChecks: libredditNormalRedirectsChecks,
+							libredditNormalRedirectsChecks,
 							libredditNormalCustomRedirects: [],
 
 							libredditTorRedirectsChecks: [...redirects.libreddit.tor],
@@ -420,7 +364,7 @@ function initDefaults() {
 							libredditLokiRedirectsChecks: [...redirects.libreddit.loki],
 							libredditLokiCustomRedirects: [],
 
-							tedditNormalRedirectsChecks: tedditNormalRedirectsChecks,
+							tedditNormalRedirectsChecks,
 							tedditNormalCustomRedirects: [],
 
 							tedditTorRedirectsChecks: [...redirects.teddit.tor],
@@ -442,9 +386,7 @@ function initDefaults() {
 export default {
 	setRedirects,
 	initLibredditCookies,
-	pasteLibredditCookies,
 	initTedditCookies,
-	pasteTedditCookies,
 
 	redirect,
 	initDefaults,
diff --git a/src/assets/javascripts/reuters.js b/src/assets/javascripts/reuters.js
index e4afa19c..51d16329 100644
--- a/src/assets/javascripts/reuters.js
+++ b/src/assets/javascripts/reuters.js
@@ -17,16 +17,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.neuters = val
 		neutersNormalRedirectsChecks = [...redirects.neuters.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = neutersNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) neutersNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			neutersRedirects: redirects,
 			neutersNormalRedirectsChecks,
+			neutersTorRedirectsChecks: [...redirects.neuters.tor],
+			neutersI2pRedirectsChecks: [...redirects.neuters.i2p],
+			neutersLokiRedirectsChecks: [...redirects.neuters.loki],
 		})
 	})
 }
@@ -109,26 +112,33 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.set(
-					{
-						disableReuters: true,
-
-						reutersRedirects: redirects,
-
-						neutersNormalRedirectsChecks: [...redirects.neuters.normal],
-						neutersNormalCustomRedirects: [],
-
-						neutersTorRedirectsChecks: [...redirects.neuters.tor],
-						neutersTorCustomRedirects: [],
-
-						neutersI2pRedirectsChecks: [...redirects.neuters.i2p],
-						neutersI2pCustomRedirects: [],
-
-						neutersLokiRedirectsChecks: [...redirects.neuters.loki],
-						neutersLokiCustomRedirects: [],
-					},
-					() => resolve()
-				)
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
+					neutersNormalRedirectsChecks = [...redirects.neuters.normal]
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = neutersNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) neutersNormalRedirectsChecks.splice(a, 1)
+					}
+					browser.storage.local.set(
+						{
+							disableReuters: true,
+
+							reutersRedirects: redirects,
+
+							neutersNormalRedirectsChecks,
+							neutersNormalCustomRedirects: [],
+
+							neutersTorRedirectsChecks: [...redirects.neuters.tor],
+							neutersTorCustomRedirects: [],
+
+							neutersI2pRedirectsChecks: [...redirects.neuters.i2p],
+							neutersI2pCustomRedirects: [],
+
+							neutersLokiRedirectsChecks: [...redirects.neuters.loki],
+							neutersLokiCustomRedirects: [],
+						},
+						() => resolve()
+					)
+				})
 			})
 	})
 }
diff --git a/src/assets/javascripts/search.js b/src/assets/javascripts/search.js
index b076f5d0..64b56caa 100644
--- a/src/assets/javascripts/search.js
+++ b/src/assets/javascripts/search.js
@@ -8,52 +8,22 @@ const frontends = new Array("searx", "searxng", "whoogle", "librex")
 const protocols = new Array("normal", "tor", "i2p", "loki")
 
 const redirects = {}
-/*
-  "searx": {
-    "normal": [],
-    "tor": [],
-    "i2p": []
-  },
-  "searxng": {
-    "normal": [],
-    "tor": [],
-    "i2p": []
-  },
-  "whoogle": {
-    "normal": [],
-    "tor": [],
-    "i2p": []
-  }
-  */
-//};
-
-//let tmp = "{"
 
 for (let i = 0; i < frontends.length; i++) {
-	//redirects.frontends[i] = {}
-	//redirects.push(frontends[i])
-	//tmp = frontends[i]
-	//tmp = tmp + '\n"' + frontends[i] + '": {'
 	redirects[frontends[i]] = {}
 	for (let x = 0; x < protocols.length; x++) {
-		//redirects.frontends[i].protocols = []
-		//tmp = tmp + '\n"' + protocols[x] + '": [],'
 		redirects[frontends[i]][protocols[x]] = []
 	}
-	//tmp = tmp + "\n},"
 }
-//tmp = tmp + "\n}"
-
-//const redirects = JSON.parse(tmp)
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects = val
 		searxNormalRedirectsChecks = [...redirects.searx.normal]
 		searxngNormalRedirectsChecks = [...redirects.searxng.normal]
 		whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]
 		librexNormalRedirectsChecks = [...redirects.librex.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = searxNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) searxNormalRedirectsChecks.splice(a, 1)
 
@@ -69,9 +39,21 @@ function setRedirects(val) {
 		browser.storage.local.set({
 			searchRedirects: redirects,
 			searxNormalRedirectsChecks,
+			searxTorRedirectsChecks: [...redirects.searx.tor],
+			searxI2pRedirectsChecks: [...redirects.searx.i2p],
+			searxLokiRedirectsChecks: [...redirects.searx.loki],
 			searxngNormalRedirectsChecks,
+			searxngTorRedirectsChecks: [...redirects.searxng.tor],
+			searxngI2pRedirectsChecks: [...redirects.searxng.i2p],
+			searxngLokiRedirectsChecks: [...redirects.searxng.loki],
 			whoogleNormalRedirectsChecks,
+			whoogleTorRedirectsChecks: [...redirects.whoogle.tor],
+			whoogleI2pRedirectsChecks: [...redirects.whoogle.i2p],
+			whoogleLokiRedirectsChecks: [...redirects.whoogle.loki],
 			librexNormalRedirectsChecks,
+			librexTorRedirectsChecks: [...redirects.librex.tor],
+			librexI2pRedirectsChecks: [...redirects.librex.i2p],
+			librexLokiRedirectsChecks: [...redirects.librex.loki],
 		})
 	})
 }
@@ -240,41 +222,6 @@ function initSearxCookies(test, from) {
 	})
 }
 
-function pasteSearxCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableSearch || searchFrontend != "searx") {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...searxLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...searxI2pCustomRedirects, ...searxI2pRedirectsChecks]
-		else if (protocol == "tor") checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("searx", checkedInstances, "advanced_search")
-		utils.getCookiesFromStorage("searx", checkedInstances, "autocomplete")
-		utils.getCookiesFromStorage("searx", checkedInstances, "categories")
-		utils.getCookiesFromStorage("searx", checkedInstances, "disabled_engines")
-		utils.getCookiesFromStorage("searx", checkedInstances, "disabled_plugins")
-		utils.getCookiesFromStorage("searx", checkedInstances, "doi_resolver")
-		utils.getCookiesFromStorage("searx", checkedInstances, "enabled_engines")
-		utils.getCookiesFromStorage("searx", checkedInstances, "enabled_plugins")
-		utils.getCookiesFromStorage("searx", checkedInstances, "image_proxy")
-		utils.getCookiesFromStorage("searx", checkedInstances, "language")
-		utils.getCookiesFromStorage("searx", checkedInstances, "locale")
-		utils.getCookiesFromStorage("searx", checkedInstances, "method")
-		utils.getCookiesFromStorage("searx", checkedInstances, "oscar-style")
-		utils.getCookiesFromStorage("searx", checkedInstances, "results_on_new_tab")
-		utils.getCookiesFromStorage("searx", checkedInstances, "safesearch")
-		utils.getCookiesFromStorage("searx", checkedInstances, "theme")
-		utils.getCookiesFromStorage("searx", checkedInstances, "tokens")
-		resolve()
-	})
-}
-
 function initSearxngCookies(test, from) {
 	return new Promise(async resolve => {
 		await init()
@@ -326,43 +273,6 @@ function initSearxngCookies(test, from) {
 	})
 }
 
-function pasteSearxngCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if ((disableSearch || searchFrontend != "searxng", protocol === undefined)) {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...searxngLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...searxngI2pCustomRedirects, ...searxngI2pRedirectsChecks]
-		else if (protocol == "tor") checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("searxng", checkedInstances, "autocomplete")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "categories")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "disabled_engines")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "disabled_plugins")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "doi_resolver")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "enabled_plugins")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "enabled_engines")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "image_proxy")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "infinite_scroll")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "language")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "locale")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "maintab")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "method")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "query_in_title")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "results_on_new_tab")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "safesearch")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "simple_style")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "theme")
-		utils.getCookiesFromStorage("searxng", checkedInstances, "tokens")
-		resolve()
-	})
-}
-
 function initLibrexCookies(test, from) {
 	return new Promise(async resolve => {
 		await init()
@@ -403,32 +313,6 @@ function initLibrexCookies(test, from) {
 	})
 }
 
-function pasteLibrexCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if ((disableSearch || searchFrontend != "librex", protocol === undefined)) {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...librexLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...librexI2pCustomRedirects, ...librexI2pRedirectsChecks]
-		else if (protocol == "tor") checkedInstances = [...librexTorRedirectsChecks, ...librexTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("librex", checkedInstances, "bibliogram")
-		utils.getCookiesFromStorage("librex", checkedInstances, "disable_special")
-		utils.getCookiesFromStorage("librex", checkedInstances, "invidious")
-		utils.getCookiesFromStorage("librex", checkedInstances, "libreddit")
-		utils.getCookiesFromStorage("librex", checkedInstances, "nitter")
-		utils.getCookiesFromStorage("librex", checkedInstances, "proxitok")
-		utils.getCookiesFromStorage("librex", checkedInstances, "theme")
-		utils.getCookiesFromStorage("librex", checkedInstances, "wikiless")
-		resolve()
-	})
-}
-
 function redirect(url, disableOverride) {
 	if (disableSearch && !disableOverride) return
 	if (!targets.some(rx => rx.test(url.href))) return
@@ -597,34 +481,27 @@ function initDefaults() {
 			.then(response => response.text())
 			.then(async data => {
 				let dataJson = JSON.parse(data)
-				/*
-      redirects.searx = dataJson.searx;
-      redirects.searxng = dataJson.searxng;
-      redirects.whoogle = dataJson.whoogle;
-      */
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
 
-				browser.storage.local.get("cloudflareBlackList", async r => {
-					whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					searxNormalRedirectsChecks = [...redirects.searx.normal]
 					searxngNormalRedirectsChecks = [...redirects.searxng.normal]
+					whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]
 					librexNormalRedirectsChecks = [...redirects.librex.normal]
-					for (const instance of r.cloudflareBlackList) {
-						let i
-
-						i = whoogleNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) whoogleNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = searxNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) searxNormalRedirectsChecks.splice(a, 1)
 
-						i = searxNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) searxNormalRedirectsChecks.splice(i, 1)
+						const b = searxngNormalRedirectsChecks.indexOf(instance)
+						if (b > -1) searxngNormalRedirectsChecks.splice(b, 1)
 
-						i = searxngNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) searxngNormalRedirectsChecks.splice(i, 1)
+						const c = whoogleNormalRedirectsChecks.indexOf(instance)
+						if (c > -1) whoogleNormalRedirectsChecks.splice(c, 1)
 
-						i = librexNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) librexNormalRedirectsChecks.splice(i, 1)
+						const d = librexNormalRedirectsChecks.indexOf(instance)
+						if (d > -1) librexNormalRedirectsChecks.splice(d, 1)
 					}
 					browser.storage.local.set(
 						{
@@ -633,7 +510,7 @@ function initDefaults() {
 							searchRedirects: redirects,
 							searxngCustomSettings: false,
 
-							whoogleNormalRedirectsChecks: whoogleNormalRedirectsChecks,
+							whoogleNormalRedirectsChecks,
 							whoogleNormalCustomRedirects: [],
 
 							whoogleTorRedirectsChecks: [...redirects.whoogle.tor],
@@ -645,7 +522,7 @@ function initDefaults() {
 							whoogleLokiRedirectsChecks: [...redirects.whoogle.loki],
 							whoogleLokiCustomRedirects: [],
 
-							searxNormalRedirectsChecks: searxNormalRedirectsChecks,
+							searxNormalRedirectsChecks,
 							searxNormalCustomRedirects: [],
 
 							searxTorRedirectsChecks: [...redirects.searx.tor],
@@ -657,7 +534,7 @@ function initDefaults() {
 							searxLokiRedirectsChecks: [...redirects.searx.loki],
 							searxLokiCustomRedirects: [],
 
-							searxngNormalRedirectsChecks: searxngNormalRedirectsChecks,
+							searxngNormalRedirectsChecks,
 							searxngNormalCustomRedirects: [],
 
 							searxngTorRedirectsChecks: [...redirects.searxng.tor],
@@ -669,7 +546,7 @@ function initDefaults() {
 							searxngLokiRedirectsChecks: [...redirects.searxng.loki],
 							searxngLokiCustomRedirects: [],
 
-							librexNormalRedirectsChecks: librexNormalRedirectsChecks,
+							librexNormalRedirectsChecks,
 							librexNormalCustomRedirects: [],
 
 							librexTorRedirectsChecks: [...redirects.librex.tor],
@@ -691,11 +568,8 @@ function initDefaults() {
 export default {
 	setRedirects,
 	initSearxCookies,
-	pasteSearxCookies,
 	initSearxngCookies,
-	pasteSearxngCookies,
 	initLibrexCookies,
-	pasteLibrexCookies,
 	redirect,
 	initDefaults,
 	switchInstance,
diff --git a/src/assets/javascripts/sendTargets.js b/src/assets/javascripts/sendTargets.js
index ba892fe3..a52ab6ff 100644
--- a/src/assets/javascripts/sendTargets.js
+++ b/src/assets/javascripts/sendTargets.js
@@ -17,16 +17,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.send = val
 		sendNormalRedirectsChecks = [...redirects.send.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = sendNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) sendNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			sendTargetsRedirects: redirects,
 			sendNormalRedirectsChecks,
+			sendTorRedirectsChecks: [...redirects.send.tor],
+			sendI2pRedirectsChecks: [...redirects.send.i2p],
+			sendLokiRedirectsChecks: [...redirects.send.loki],
 		})
 	})
 }
@@ -154,18 +157,18 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					sendNormalRedirectsChecks = [...redirects.send.normal]
-					for (const instance of r.cloudflareBlackList) {
-						let i = sendNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) sendNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = sendNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) sendNormalRedirectsChecks.splice(a, 1)
 					}
 					browser.storage.local.set(
 						{
 							disableSendTarget: false,
 							sendTargetsRedirects: redirects,
 
-							sendNormalRedirectsChecks: sendNormalRedirectsChecks,
+							sendNormalRedirectsChecks,
 							sendNormalCustomRedirects: [],
 
 							sendTorRedirectsChecks: [...redirects.send.tor],
diff --git a/src/assets/javascripts/tiktok.js b/src/assets/javascripts/tiktok.js
index ba4a9ff1..71f07687 100644
--- a/src/assets/javascripts/tiktok.js
+++ b/src/assets/javascripts/tiktok.js
@@ -17,16 +17,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.proxiTok = val
 		proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = proxiTokNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			tiktokRedirects: redirects,
 			proxiTokNormalRedirectsChecks,
+			proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
+			proxiTokI2pRedirectsChecks: [...redirects.proxiTok.i2p],
+			proxiTokLokiRedirectsChecks: [...redirects.proxiTok.loki],
 		})
 	})
 }
@@ -62,26 +65,6 @@ function initProxiTokCookies(test, from) {
 	})
 }
 
-function pasteProxiTokCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableTiktok || protocol === undefined) {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...proxiTokI2pCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...proxiTokLokiCustomRedirects]
-		else if (protocol == "tor") checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("proxitok", checkedInstances, "theme")
-		utils.getCookiesFromStorage("proxitok", checkedInstances, "api-legacy")
-		resolve()
-	})
-}
-
 let disableTiktok,
 	protocol,
 	protocolFallback,
@@ -222,39 +205,42 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.set(
-					{
-						disableTiktok: false,
-
-						tiktokRedirects: redirects,
-
-						proxiTokNormalRedirectsChecks: [...redirects.proxiTok.normal],
-						proxiTokNormalCustomRedirects: [],
-
-						proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
-						proxiTokTorCustomRedirects: [],
-
-						proxiTokI2pRedirectsChecks: [...redirects.proxiTok.i2p],
-						proxiTokI2pCustomRedirects: [],
-
-						proxiTokLokiRedirectsChecks: [...redirects.proxiTok.loki],
-						proxiTokLokiCustomRedirects: [],
-					},
-					() => resolve()
-				)
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
+					proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal]
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = proxiTokNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1)
+					}
+					browser.storage.local.set(
+						{
+							disableTiktok: false,
+
+							tiktokRedirects: redirects,
+
+							proxiTokNormalRedirectsChecks,
+							proxiTokNormalCustomRedirects: [],
+
+							proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
+							proxiTokTorCustomRedirects: [],
+
+							proxiTokI2pRedirectsChecks: [...redirects.proxiTok.i2p],
+							proxiTokI2pCustomRedirects: [],
+
+							proxiTokLokiRedirectsChecks: [...redirects.proxiTok.loki],
+							proxiTokLokiCustomRedirects: [],
+						},
+						() => resolve()
+					)
+				})
 			})
 	})
 }
 
 export default {
 	setRedirects,
-
 	redirect,
 	reverse,
 	switchInstance,
-
 	initProxiTokCookies,
-	pasteProxiTokCookies,
-
 	initDefaults,
 }
diff --git a/src/assets/javascripts/translate/translate.js b/src/assets/javascripts/translate/translate.js
index 5512f7f1..993c630f 100644
--- a/src/assets/javascripts/translate/translate.js
+++ b/src/assets/javascripts/translate/translate.js
@@ -91,21 +91,27 @@ init()
 browser.storage.onChanged.addListener(init)
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects = val
+		simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]
 		lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
-		for (const instance of r.cloudflareBlackList) {
-			const i = lingvaNormalRedirectsChecks.indexOf(instance)
-			if (i > -1) lingvaNormalRedirectsChecks.splice(i, 1)
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+			const a = simplyTranslateNormalCustomRedirects.indexOf(instance)
+			if (a > -1) simplyTranslateNormalCustomRedirects.splice(a, 1)
+
+			const b = lingvaNormalRedirectsChecks.indexOf(instance)
+			if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1)
 		}
 		browser.storage.local.set({
 			translateRedirects: redirects,
-			simplyTranslateNormalRedirectsChecks: redirects.simplyTranslate.normal,
-			simplyTranslateTorRedirectsChecks: redirects.simplyTranslate.tor,
-			simplyTranslateI2pRedirectsChecks: redirects.simplyTranslate.i2p,
-			simplyTranslateLokiRedirectsChecks: redirects.simplyTranslate.loki,
+			simplyTranslateNormalRedirectsChecks,
+			simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
+			simplyTranslateI2pRedirectsChecks: [...redirects.simplyTranslate.i2p],
+			simplyTranslateLokiRedirectsChecks: [...redirects.simplyTranslate.loki],
 			lingvaNormalRedirectsChecks,
-			lingvaTorRedirectsChecks: redirects.lingva.tor,
+			lingvaTorRedirectsChecks: [...redirects.lingva.tor],
+			lingvaI2pRedirectsChecks: [...redirects.lingva.i2p],
+			lingvaLokiRedirectsChecks: [...redirects.lingva.loki],
 		})
 	})
 }
@@ -160,33 +166,6 @@ function copyPasteLingvaLocalStorage(test, url, tabId) {
 	})
 }
 
-function pasteLingvaLocalStorage() {
-	return new Promise(async resolve => {
-		await init()
-		if (translateDisable || translateFrontend != "lingva") {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...lingvaLokiCustomRedirects]
-		//...lingvaLokiRedirectsChecks,
-		else if (protocol == "i2p") checkedInstances = [...lingvaI2pCustomRedirects]
-		//...lingvaI2pRedirectsChecks,
-		else if (protocol == "tor") checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]
-		}
-		for (const to of checkedInstances)
-			browser.tabs.create({ url: to }, tab =>
-				browser.tabs.executeScript(tab.id, {
-					file: "/assets/javascripts/translate/set_lingva_preferences.js",
-					runAt: "document_start",
-				})
-			)
-		resolve()
-	})
-}
-
 function copyPasteSimplyTranslateCookies(test, from) {
 	return new Promise(async resolve => {
 		await init()
@@ -223,28 +202,6 @@ function copyPasteSimplyTranslateCookies(test, from) {
 	})
 }
 
-function pasteSimplyTranslateCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if (translateDisable || translateFrontend != "simplyTranslate") {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...simplyTranslateI2pCustomRedirects, ...simplyTranslateI2pRedirectsChecks]
-		else if (protocol == "tor") checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("simplyTranslate", checkedInstances, "from_lang")
-		utils.getCookiesFromStorage("simplyTranslate", checkedInstances, "to_lang")
-		utils.getCookiesFromStorage("simplyTranslate", checkedInstances, "tts_enabled")
-		utils.getCookiesFromStorage("simplyTranslate", checkedInstances, "use_text_fields")
-		resolve()
-	})
-}
-
 function redirect(url, disableOverride) {
 	if (translateDisable && !disableOverride) return
 	if (!targets.some(rx => rx.test(url.href))) return
@@ -320,7 +277,7 @@ function switchInstance(url, disableOverride) {
 			return
 		}
 
-		let instancesList
+		let instancesList = []
 
 		if (protocol == "loki") {
 			if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomRedirects]
@@ -353,16 +310,20 @@ function initDefaults() {
 	return new Promise(async resolve => {
 		fetch("/instances/data.json")
 			.then(response => response.text())
-			.then(data => {
+			.then(async data => {
 				let dataJson = JSON.parse(data)
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
+					simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]
 					lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
-					for (const instance of r.cloudflareBlackList) {
-						const i = lingvaNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) lingvaNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = simplyTranslateNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1)
+
+						const b = lingvaNormalRedirectsChecks.indexOf(instance)
+						if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1)
 					}
 					browser.storage.local.set(
 						{
@@ -370,7 +331,7 @@ function initDefaults() {
 							translateFrontend: "simplyTranslate",
 							translateRedirects: redirects,
 
-							simplyTranslateNormalRedirectsChecks: [...redirects.simplyTranslate.normal],
+							simplyTranslateNormalRedirectsChecks,
 							simplyTranslateNormalCustomRedirects: [],
 
 							simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
@@ -382,7 +343,7 @@ function initDefaults() {
 							simplyTranslateLokiRedirectsChecks: [...redirects.simplyTranslate.loki],
 							simplyTranslateLokiCustomRedirects: [],
 
-							lingvaNormalRedirectsChecks: lingvaNormalRedirectsChecks,
+							lingvaNormalRedirectsChecks,
 							lingvaNormalCustomRedirects: [],
 
 							lingvaTorRedirectsChecks: [...redirects.lingva.tor],
@@ -403,9 +364,7 @@ function initDefaults() {
 
 export default {
 	copyPasteSimplyTranslateCookies,
-	pasteSimplyTranslateCookies,
 	copyPasteLingvaLocalStorage,
-	pasteLingvaLocalStorage,
 	setRedirects,
 	redirect,
 	initDefaults,
diff --git a/src/assets/javascripts/twitter.js b/src/assets/javascripts/twitter.js
index 1ec4d8eb..7111ad00 100644
--- a/src/assets/javascripts/twitter.js
+++ b/src/assets/javascripts/twitter.js
@@ -17,10 +17,10 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList"], r => {
+	browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], r => {
 		redirects.nitter = val
 		nitterNormalRedirectsChecks = [...redirects.nitter.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList]) {
+		for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList, ...r.offlineBlackList]) {
 			let i = nitterNormalRedirectsChecks.indexOf(instance)
 			if (i > -1) nitterNormalRedirectsChecks.splice(i, 1)
 		}
@@ -28,6 +28,8 @@ function setRedirects(val) {
 			twitterRedirects: redirects,
 			nitterNormalRedirectsChecks,
 			nitterTorRedirectsChecks: [...redirects.nitter.tor],
+			nitterI2pRedirectsChecks: [...redirects.nitter.i2p],
+			nitterLokiRedirectsChecks: [...redirects.nitter.loki],
 		})
 	})
 }
@@ -215,43 +217,6 @@ function initNitterCookies(test, from) {
 	})
 }
 
-function pasteNitterCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableTwitter || protocol === undefined) {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...nitterI2pCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...nitterLokiCustomRedirects]
-		else if (protocol == "tor") checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("nitter", checkedInstances, "theme")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "infiniteScroll")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "stickyProfile")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "bidiSupport")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "hideTweetStats")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "hideBanner")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "hidePins")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "hideReplies")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "squareAvatars")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "mp4Playback")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "hlsPlayback")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "proxyVideos")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "muteVideos")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "autoplayGifs")
-
-		utils.getCookiesFromStorage("nitter", checkedInstances, "replaceInstagram")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "replaceReddit")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "replaceTwitter")
-		utils.getCookiesFromStorage("nitter", checkedInstances, "replaceYouTube")
-		resolve()
-	})
-}
-
 function initDefaults() {
 	return new Promise(resolve => {
 		fetch("/instances/data.json")
@@ -261,9 +226,9 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList"], async r => {
+				browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], async r => {
 					nitterNormalRedirectsChecks = [...redirects.nitter.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList]) {
+					for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList, ...r.offlineBlackList]) {
 						let i = nitterNormalRedirectsChecks.indexOf(instance)
 						if (i > -1) nitterNormalRedirectsChecks.splice(i, 1)
 					}
@@ -273,7 +238,7 @@ function initDefaults() {
 							twitterRedirects: redirects,
 							twitterRedirectType: "both",
 
-							nitterNormalRedirectsChecks: nitterNormalRedirectsChecks,
+							nitterNormalRedirectsChecks,
 							nitterNormalCustomRedirects: [],
 
 							nitterTorRedirectsChecks: [...redirects.nitter.tor],
@@ -299,6 +264,5 @@ export default {
 	reverse,
 	removeXFrameOptions,
 	initNitterCookies,
-	pasteNitterCookies,
 	initDefaults,
 }
diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js
index 9a7d37b3..50ada765 100644
--- a/src/assets/javascripts/utils.js
+++ b/src/assets/javascripts/utils.js
@@ -25,13 +25,15 @@ function getRandomInstance(instances) {
 
 let cloudflareBlackList = []
 let authenticateBlackList = []
-async function initcloudflareBlackList() {
+let offlineBlackList = []
+async function initBlackList() {
 	return new Promise(resolve => {
 		fetch("/instances/blacklist.json")
 			.then(response => response.text())
 			.then(data => {
 				cloudflareBlackList = JSON.parse(data).cloudflare
 				authenticateBlackList = JSON.parse(data).authenticate
+				offlineBlackList = JSON.parse(data).offline
 				resolve()
 			})
 	})
@@ -53,13 +55,14 @@ function updateInstances() {
 				return
 			}
 		}
-		await initcloudflareBlackList()
+		await initBlackList()
 		const instances = JSON.parse(http.responseText)
 
 		youtubeHelper.setRedirects({
 			invidious: instances.invidious,
 			piped: instances.piped,
 			pipedMaterial: instances.pipedMaterial,
+			cloudtube: instances.cloudtube,
 		})
 		twitterHelper.setRedirects(instances.nitter)
 		instagramHelper.setRedirects(instances.bibliogram)
@@ -114,7 +117,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
 	let nameCustomInstances = []
 	let nameCheckListElement = nameProtocolElement.getElementsByClassName("checklist")[0]
 
-	await initcloudflareBlackList()
+	await initBlackList()
 
 	let nameDefaultRedirects
 
@@ -162,6 +165,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
 		...redirects[name][protocol].map(x => {
 			const cloudflare = cloudflareBlackList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : ""
 			const authenticate = authenticateBlackList.includes(x) ? ' <span style="color:orange;">authenticate</span>' : ""
+			const offline = offlineBlackList.includes(x) ? ' <span style="color:grey;">offline</span>' : ""
 
 			let ms = instancesLatency[x]
 			let latencyColor = ms <= 1000 ? "green" : ms <= 2000 ? "orange" : "red"
@@ -172,7 +176,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
 
 			const latency = x in instancesLatency ? '<span style="color:' + latencyColor + ';">' + latencyLimit + "</span>" : ""
 
-			let warnings = [cloudflare, authenticate, latency].join(" ")
+			let warnings = [cloudflare, authenticate, offline, latency].join(" ")
 			return `<div>
                     <x><a href="${x}" target="_blank">${x}</a>${warnings}</x>
                     <input type="checkbox" class="${x}"/>
@@ -247,34 +251,57 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
 	})
 }
 
-async function ping(href) {
+function ping(href) {
 	return new Promise(async resolve => {
+		let average = 0
+		let time
+		for (let i = 0; i < 3; i++) {
+			time = await pingOnce(href)
+			if (i == 0) continue
+			if (time >= 5000) {
+				resolve(time)
+				return
+			}
+			average += time
+		}
+		average = parseInt(average / 3)
+		resolve(average)
+	})
+}
+
+function pingOnce(href) {
+	return new Promise(async resolve => {
+		let started
 		let http = new XMLHttpRequest()
-		http.open("GET", `${href}?_=${new Date().getTime()}`, /*async*/ true)
 		http.timeout = 5000
-		let started = new Date().getTime()
+		http.ontimeout = () => resolve(5000)
+		http.onerror = () => resolve()
 		http.onreadystatechange = () => {
 			if (http.readyState == 2) {
 				if (http.status == 200) {
 					let ended = new Date().getTime()
 					http.abort()
 					resolve(ended - started)
-				} else resolve(5000 + http.status)
+				} else {
+					resolve(5000 + http.status)
+				}
 			}
 		}
-		http.ontimeout = () => resolve(5000)
-		http.onerror = () => resolve()
-		try {
-			http.send(null)
-		} catch (exception) {
-			resolve()
-		}
+		http.open("GET", `${href}?_=${new Date().getTime()}`, true)
+		started = new Date().getTime()
+		http.send(null)
 	})
 }
 
-async function testLatency(element, instances) {
+async function testLatency(element, instances, frontend) {
 	return new Promise(async resolve => {
 		let myList = {}
+		let latencyThreshold
+		let redirectsChecks = []
+		browser.storage.local.get(["latencyThreshold", `${frontend}NormalRedirectsChecks`], r => {
+			latencyThreshold = r.latencyThreshold
+			redirectsChecks = r[`${frontend}NormalRedirectsChecks`]
+		})
 		for (const href of instances)
 			await ping(href).then(time => {
 				if (time) {
@@ -284,6 +311,12 @@ async function testLatency(element, instances) {
 					else if (time <= 2000) color = "orange"
 					else color = "red"
 
+					if (time > latencyThreshold) {
+						redirectsChecks.splice(redirectsChecks.indexOf(href), 1)
+					}
+
+					browser.storage.local.set({ [`${frontend}NormalRedirectsChecks`]: redirectsChecks })
+
 					let text
 					if (time == 5000) text = "5000ms+"
 					else if (time > 5000) text = `ERROR: ${time - 5000}`
@@ -299,7 +332,11 @@ function copyCookie(frontend, targetUrl, urls, name) {
 	return new Promise(resolve => {
 		browser.storage.local.get("firstPartyIsolate", r => {
 			let query
-			if (!r.firstPartyIsolate) query = { url: protocolHost(targetUrl), name: name }
+			if (!r.firstPartyIsolate)
+				query = {
+					url: protocolHost(targetUrl),
+					name: name,
+				}
 			else
 				query = {
 					url: protocolHost(targetUrl),
@@ -325,7 +362,7 @@ function copyCookie(frontend, targetUrl, urls, name) {
 										secure: true,
 										expirationDate: cookie.expirationDate,
 								  }
-							browser.cookies.set(setQuery, () => browser.storage.local.set({ [`${frontend}_${name}`]: cookie }, () => resolve()))
+							browser.cookies.set(setQuery)
 						}
 						break
 					}
@@ -335,30 +372,25 @@ function copyCookie(frontend, targetUrl, urls, name) {
 	})
 }
 
-function getCookiesFromStorage(frontend, urls, name) {
-	let key = `${frontend}_${name}`
-	browser.storage.local.get([key, "firstPartyIsolate"], r => {
-		const cookie = r[key]
-		if (cookie === undefined) return
-		for (const url of urls) {
-			let query = r.firstPartyIsolate
-				? {
-						url: url,
-						name: cookie.name,
-						value: cookie.value,
-						secure: true,
-						expirationDate: null,
-						firstPartyDomain: new URL(url).hostname,
-				  }
-				: {
-						url: url,
-						name: cookie.name,
-						value: cookie.value,
-						secure: true,
-						expirationDate: cookie.expirationDate,
-				  }
-			browser.cookies.set(query)
-		}
+function getPreferencesFromToken(frontend, targetUrl, urls, name, endpoint) {
+	return new Promise(resolve => {
+		browser.storage.local.get("firstPartyIsolate", r => {
+			const http = new XMLHttpRequest()
+			const url = `${targetUrl}${endpoint}`
+			http.open("GET", url, false)
+			http.setRequestHeader("Cookie", `${name}=${cookie.value}`)
+			http.send(null)
+			const preferences = JSON.parse(http.responseText)
+			let formdata = new FormData()
+			for (var key in preferences) formdata.append(key, preferences[key])
+			for (const url of urls) {
+				const http = new XMLHttpRequest()
+				http.open("POST", `${url}/settings/stay`, false)
+				http.send(null)
+			}
+			resolve()
+			return
+		})
 	})
 }
 
@@ -412,10 +444,6 @@ function unify(test) {
 					resolve()
 					return
 				}
-				if (currTab.incognito) {
-					resolve()
-					return
-				}
 
 				let result = await youtubeHelper.copyPasteInvidiousCookies(test, url)
 				if (!result) result = await youtubeHelper.copyPastePipedLocalStorage(test, url, currTab.id)
@@ -431,6 +459,7 @@ function unify(test) {
 				if (!result) result = await wikipediaHelper.initWikilessCookies(test, url)
 				if (!result) result = await translateHelper.copyPasteSimplyTranslateCookies(test, url)
 				if (!result) result = await translateHelper.copyPasteLingvaLocalStorage(test, url)
+				if (!result) result = await instagramHelper.initBibliogramPreferences(test, url)
 
 				resolve(result)
 			}
@@ -482,12 +511,12 @@ function latency(name, frontend, document, location) {
 	latencyElement.addEventListener("click", async () => {
 		let reloadWindow = () => location.reload()
 		latencyElement.addEventListener("click", reloadWindow)
-		let key = `${name}Redirects`
+		let key = `${name} Redirects`
 		browser.storage.local.get(key, r => {
 			let redirects = r[key]
 			const oldHtml = latencyLabel.innerHTML
 			latencyLabel.innerHTML = "..."
-			testLatency(latencyLabel, redirects[frontend].normal).then(r => {
+			testLatency(latencyLabel, redirects[frontend].normal, frontend).then(r => {
 				browser.storage.local.set({ [`${frontend}Latency`]: r })
 				latencyLabel.innerHTML = oldHtml
 				processDefaultCustomInstances(name, frontend, "normal", document)
@@ -504,7 +533,7 @@ export default {
 	processDefaultCustomInstances,
 	latency,
 	copyCookie,
-	getCookiesFromStorage,
+	getPreferencesFromToken,
 	switchInstance,
 	copyRaw,
 	unify,
diff --git a/src/assets/javascripts/wikipedia.js b/src/assets/javascripts/wikipedia.js
index cf19b208..2d0f75a1 100644
--- a/src/assets/javascripts/wikipedia.js
+++ b/src/assets/javascripts/wikipedia.js
@@ -17,16 +17,19 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects.wikiless = val
 		wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = wikilessNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1)
 		}
 		browser.storage.local.set({
 			wikipediaRedirects: redirects,
 			wikilessNormalRedirectsChecks,
+			wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
+			wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
+			wikilessLokiRedirectsChecks: [...redirects.wikiless.loki],
 		})
 	})
 }
@@ -113,26 +116,6 @@ function initWikilessCookies(test, from) {
 	})
 }
 
-function pasteWikilessCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableWikipedia || protocol === undefined) {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...wikilessLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
-		else if (protocol == "tor") checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("wikiless", checkedInstances, "theme")
-		utils.getCookiesFromStorage("wikiless", checkedInstances, "default_lang")
-		resolve()
-	})
-}
-
 function redirect(url, disableOverride) {
 	if (disableWikipedia && !disableOverride) return
 	if (!targets.test(url.href)) return
@@ -220,18 +203,18 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]
-					for (const instance of r.cloudflareBlackList) {
-						let i = wikilessNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) wikilessNormalRedirectsChecks.splice(i, 1)
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = wikilessNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1)
 					}
 					browser.storage.local.set(
 						{
 							disableWikipedia: true,
 							wikipediaRedirects: redirects,
 
-							wikilessNormalRedirectsChecks: wikilessNormalRedirectsChecks,
+							wikilessNormalRedirectsChecks,
 							wikilessNormalCustomRedirects: [],
 
 							wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
@@ -252,10 +235,7 @@ function initDefaults() {
 
 export default {
 	setRedirects,
-
 	initWikilessCookies,
-	pasteWikilessCookies,
-
 	redirect,
 	initDefaults,
 	switchInstance,
diff --git a/src/assets/javascripts/youtube/youtube.js b/src/assets/javascripts/youtube/youtube.js
index e8a77ff6..32f06b9c 100644
--- a/src/assets/javascripts/youtube/youtube.js
+++ b/src/assets/javascripts/youtube/youtube.js
@@ -30,14 +30,13 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
-		for (let i = 0; i < frontends.length; i++) {
-			redirects.frontends = val.frontends
-		}
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
+		redirects = val
 		invidiousNormalRedirectsChecks = [...redirects.invidious.normal]
 		pipedNormalRedirectsChecks = [...redirects.piped.normal]
 		pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
-		for (const instance of r.cloudflareBlackList) {
+		cloudtubeNormalRedirectsChecks = [...redirects.cloudtube.normal]
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = invidiousNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1)
 
@@ -53,9 +52,21 @@ function setRedirects(val) {
 		browser.storage.local.set({
 			youtubeRedirects: redirects,
 			invidiousNormalRedirectsChecks,
+			invidiousTorRedirectsChecks: [...redirects.invidious.tor],
+			invidiousI2pRedirectsChecks: [...redirects.invidious.i2p],
+			invidiousLokiRedirectsChecks: [...redirects.invidious.loki],
 			pipedNormalRedirectsChecks,
+			pipedTorRedirectsChecks: [...redirects.piped.tor],
+			pipedI2pRedirectsChecks: [...redirects.piped.i2p],
+			pipedLokiRedirectsChecks: [...redirects.piped.loki],
 			pipedMaterialNormalRedirectsChecks,
+			pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
+			pipedMaterialI2pRedirectsChecks: [...redirects.pipedMaterial.i2p],
+			pipedMaterialLokiRedirectsChecks: [...redirects.pipedMaterial.loki],
 			cloudtubeNormalRedirectsChecks,
+			cloudtubeTorRedirectsChecks: [...redirects.cloudtube.tor],
+			cloudtubeI2pRedirectsChecks: [...redirects.cloudtube.i2p],
+			cloudtubeLokiRedirectsChecks: [...redirects.cloudtube.loki],
 		})
 	})
 }
@@ -450,13 +461,12 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					invidiousNormalRedirectsChecks = [...redirects.invidious.normal]
 					pipedNormalRedirectsChecks = [...redirects.piped.normal]
 					pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
 					cloudtubeNormalRedirectsChecks = [...redirects.cloudtube.normal]
-
-					for (const instance of r.cloudflareBlackList) {
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 						const a = invidiousNormalRedirectsChecks.indexOf(instance)
 						if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1)
 
@@ -467,9 +477,8 @@ function initDefaults() {
 						if (c > -1) pipedMaterialNormalRedirectsChecks.splice(c, 1)
 
 						const d = cloudtubeNormalRedirectsChecks.indexOf(instance)
-						if (d > -1) cloudtubeNormalRedirectsChecks.indexOf(instance)
+						if (c > -1) cloudtubeNormalRedirectsChecks.splice(d, 1)
 					}
-
 					browser.storage.local.set(
 						{
 							disableYoutube: false,
@@ -478,7 +487,7 @@ function initDefaults() {
 							youtubeRedirects: redirects,
 							youtubeFrontend: "invidious",
 
-							invidiousNormalRedirectsChecks: invidiousNormalRedirectsChecks,
+							invidiousNormalRedirectsChecks,
 							invidiousNormalCustomRedirects: [],
 
 							invidiousTorRedirectsChecks: [...redirects.invidious.tor],
@@ -490,7 +499,7 @@ function initDefaults() {
 							invidiousLokiRedirectsChecks: [...redirects.invidious.loki],
 							invidiousLokiCustomRedirects: [],
 
-							pipedNormalRedirectsChecks: pipedNormalRedirectsChecks,
+							pipedNormalRedirectsChecks,
 							pipedNormalCustomRedirects: [],
 
 							pipedTorRedirectsChecks: [...redirects.piped.tor],
@@ -573,25 +582,6 @@ function copyPasteInvidiousCookies(test, from) {
 	})
 }
 
-function pasteInvidiousCookies() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableYoutube || youtubeFrontend != "invidious") {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...invidiousLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...invidiousI2pCustomRedirects]
-		else if (protocol == "tor") checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
-		if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-		}
-		utils.getCookiesFromStorage("invidious", checkedInstances, "PREFS")
-		resolve()
-	})
-}
-
 function copyPastePipedLocalStorage(test, url, tabId) {
 	return new Promise(async resolve => {
 		await init()
@@ -619,7 +609,7 @@ function copyPastePipedLocalStorage(test, url, tabId) {
 			if (protocol == "loki") checkedInstances = [...pipedLokiCustomRedirects]
 			else if (protocol == "i2p") checkedInstances = [...pipedI2pCustomRedirects]
 			else if (protocol == "tor") checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
-			if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
+			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
 				checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
 			}
 			const i = checkedInstances.indexOf(protocolHost)
@@ -636,31 +626,6 @@ function copyPastePipedLocalStorage(test, url, tabId) {
 		resolve(true)
 	})
 }
-function pastePipedLocalStorage() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableYoutube || youtubeFrontend != "piped") {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...pipedLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...pipedI2pCustomRedirects]
-		else if (protocol == "tor") checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
-		}
-		for (const to of checkedInstances) {
-			browser.tabs.create({ url: to }, tab =>
-				browser.tabs.executeScript(tab.id, {
-					file: "/assets/javascripts/youtube/set_piped_preferences.js",
-					runAt: "document_start",
-				})
-			)
-		}
-		resolve()
-	})
-}
 
 function copyPastePipedMaterialLocalStorage(test, url, tabId) {
 	return new Promise(async resolve => {
@@ -711,32 +676,6 @@ function copyPastePipedMaterialLocalStorage(test, url, tabId) {
 	})
 }
 
-function pastePipedMaterialLocalStorage() {
-	return new Promise(async resolve => {
-		await init()
-		if (disableYoutube || youtubeFrontend != "pipedMaterial") {
-			resolve()
-			return
-		}
-		let checkedInstances = []
-		if (protocol == "loki") checkedInstances = [...pipedMaterialLokiCustomRedirects]
-		else if (protocol == "i2p") checkedInstances = [...pipedMaterialI2pCustomRedirects]
-		else if (protocol == "tor") checkedInstances = [...pipedMaterialTorCustomRedirects] //...pipedMaterialTorRedirectsChecks,
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
-		}
-		for (const to of checkedInstances) {
-			browser.tabs.create({ url: to }, tab =>
-				browser.tabs.executeScript(tab.id, {
-					file: "/assets/javascripts/youtube/set_pipedMaterial_preferences.js",
-					runAt: "document_start",
-				})
-			)
-		}
-		resolve()
-	})
-}
-
 function removeXFrameOptions(e) {
 	let isChanged = false
 
@@ -843,11 +782,8 @@ function removeXFrameOptions(e) {
 export default {
 	setRedirects,
 	copyPastePipedLocalStorage,
-	pastePipedLocalStorage,
 	copyPastePipedMaterialLocalStorage,
-	pastePipedMaterialLocalStorage,
 	copyPasteInvidiousCookies,
-	pasteInvidiousCookies,
 	redirect,
 	reverse,
 	switchInstance,
diff --git a/src/assets/javascripts/youtubeMusic.js b/src/assets/javascripts/youtubeMusic.js
index 3ff9a174..5d980cfe 100644
--- a/src/assets/javascripts/youtubeMusic.js
+++ b/src/assets/javascripts/youtubeMusic.js
@@ -19,11 +19,11 @@ for (let i = 0; i < frontends.length; i++) {
 }
 
 function setRedirects(val) {
-	browser.storage.local.get("cloudflareBlackList", r => {
+	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
 		redirects = val
 		beatbumpNormalRedirectsChecks = [...redirects.beatbump.normal]
 		hyperpipeNormalRedirectsChecks = [...redirects.hyperpipe.normal]
-		for (const instance of r.cloudflareBlackList) {
+		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
 			const a = beatbumpNormalRedirectsChecks.indexOf(instance)
 			if (a > -1) beatbumpNormalRedirectsChecks.splice(a, 1)
 
@@ -33,7 +33,13 @@ function setRedirects(val) {
 		browser.storage.local.set({
 			youtubeMusicRedirects: redirects,
 			beatbumpNormalRedirectsChecks,
+			beatbumpTorRedirectsChecks: [...redirects.beatbump.tor],
+			beatbumpI2pRedirectsChecks: [...redirects.beatbump.i2p],
+			beatbumpLokiRedirectsChecks: [...redirects.beatbump.loki],
 			hyperpipeNormalRedirectsChecks,
+			hyperpipeTorRedirectsChecks: [...redirects.hyperpipe.tor],
+			hyperpipeI2pRedirectsChecks: [...redirects.hyperpipe.i2p],
+			hyperpipeLokiRedirectsChecks: [...redirects.hyperpipe.loki],
 		})
 	})
 }
@@ -181,7 +187,7 @@ function getUrl(randomInstance, url) {
 				.replace("/watch?v=", "/listen?id=")
 				.replace("/channel/", "/artist/")
 				.replace("/playlist?list=", "/playlist/VL")
-				.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/") + "?filter=EgWKAQIIAWoKEAMQBBAKEAkQBQ%3D%3D")
+				.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/") + "?filter=song")
 		case "hyperpipe":
 			return `${randomInstance}${url.pathname}${url.search}`.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/"))
 	}
@@ -266,17 +272,15 @@ function initDefaults() {
 				for (let i = 0; i < frontends.length; i++) {
 					redirects[frontends[i]] = dataJson[frontends[i]]
 				}
-				browser.storage.local.get("cloudflareBlackList", async r => {
+				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
 					beatbumpNormalRedirectsChecks = [...redirects.beatbump.normal]
 					hyperpipeNormalRedirectsChecks = [...redirects.hyperpipe.normal]
-					for (const instance of r.cloudflareBlackList) {
-						let i
+					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
+						const a = beatbumpNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) beatbumpNormalRedirectsChecks.splice(a, 1)
 
-						i = beatbumpNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) beatbumpNormalRedirectsChecks.splice(i, 1)
-
-						i = hyperpipeNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) hyperpipeNormalRedirectsChecks.splice(i, 1)
+						const b = hyperpipeNormalRedirectsChecks.indexOf(instance)
+						if (b > -1) hyperpipeNormalRedirectsChecks.splice(b, 1)
 					}
 					browser.storage.local.set(
 						{
@@ -284,7 +288,7 @@ function initDefaults() {
 							youtubeMusicFrontend: "hyperpipe",
 							youtubeMusicRedirects: redirects,
 
-							beatbumpNormalRedirectsChecks: beatbumpNormalRedirectsChecks,
+							beatbumpNormalRedirectsChecks,
 							beatbumpNormalCustomRedirects: [],
 
 							beatbumpTorRedirectsChecks: [...redirects.beatbump.tor],
@@ -296,7 +300,7 @@ function initDefaults() {
 							beatbumpLokiRedirectsChecks: [...redirects.beatbump.loki],
 							beatbumpLokiCustomRedirects: [],
 
-							hyperpipeNormalRedirectsChecks: hyperpipeNormalRedirectsChecks,
+							hyperpipeNormalRedirectsChecks,
 							hyperpipeNormalCustomRedirects: [],
 
 							hyperpipeTorRedirectsChecks: [...redirects.hyperpipe.tor],
diff --git a/src/instances/beatbump.json b/src/instances/beatbump.json
index 4c7f65a6..df5a20f7 100644
--- a/src/instances/beatbump.json
+++ b/src/instances/beatbump.json
@@ -1,5 +1,8 @@
 {
-	"normal": ["https://beatbump.ml"],
+	"normal": [
+		"https://beatbump.ml",
+		"https://beatbump.esmailelbob.xyz"
+	],
 	"tor": [],
 	"i2p": [],
 	"loki": []
diff --git a/src/instances/blacklist.json b/src/instances/blacklist.json
index ec77035a..642a6639 100644
--- a/src/instances/blacklist.json
+++ b/src/instances/blacklist.json
@@ -1,11 +1,11 @@
 {
   "cloudflare": [
     "https://invidious.kavin.rocks",
-    "https://piped.kavin.rocks",
     "https://piped.tokhmi.xyz",
     "https://piped.moomoo.me",
+    "https://piped.syncpundit.com",
     "https://piped.mha.fi",
-    "https://us-piped.shimul.me",
+    "https://jp-piped.shimul.me",
     "https://pipedus.palash.dev",
     "https://piped.waffle.wiki",
     "https://watch.whatever.social",
@@ -54,5 +54,28 @@
   ],
   "authenticate": [
     "https://nitter:nitter@nitter.nixnet.services"
+  ],
+  "offline": [
+    "https://invidious.snopyta.org",
+    "https://tok.habedieeh.re",
+    "https://n.hyperborea.cloud",
+    "https://bibliogram.snopyta.org",
+    "https://insta.trom.tf",
+    "https://libreddit.autarkic.org",
+    "https://libreddit.notyourcomputer.net",
+    "https://anon.sx",
+    "https://jsearch.pw",
+    "https://searx.gnu.style",
+    "https://searx.semipvt.com",
+    "https://etsi.me",
+    "https://s.zhaocloud.net",
+    "https://search.vidhukant.xyz",
+    "https://searx.ericaftereric.top",
+    "https://searx.fmac.xyz",
+    "https://searxng.au/searx",
+    "https://search.albony.xyz",
+    "https://whoogle.esmailelbob.xyz",
+    "https://beatbump.ml",
+    "https://stube.tokhmi.xyz"
   ]
 }
\ No newline at end of file
diff --git a/src/instances/data.json b/src/instances/data.json
index 822d8c92..0565348b 100644
--- a/src/instances/data.json
+++ b/src/instances/data.json
@@ -7,7 +7,6 @@
       "https://inv.riverside.rocks",
       "https://invidious.osi.kr",
       "https://y.com.sb",
-      "https://yt.artemislena.eu",
       "https://invidious.flokinet.to",
       "https://invidious.sethforprivacy.com",
       "https://invidious.tiekoetter.com",
@@ -21,6 +20,7 @@
       "https://invidious.weblibre.org",
       "https://invidious.snopyta.org",
       "https://invidious.esmailelbob.xyz",
+      "https://yt.artemislena.eu",
       "https://invidious.namazso.eu"
     ],
     "tor": [
@@ -39,16 +39,17 @@
   },
   "piped": {
     "normal": [
-      "https://piped.kavin.rocks",
       "https://piped.tokhmi.xyz",
       "https://piped.moomoo.me",
       "https://il.ax",
+      "https://piped.syncpundit.com",
       "https://piped.mha.fi",
-      "https://us-piped.shimul.me",
+      "https://jp-piped.shimul.me",
       "https://pipedus.palash.dev",
       "https://piped.waffle.wiki",
       "https://watch.whatever.social",
       "https://yt.jae.fi",
+      "https://piped.mint.lgbt",
       "https://piped.esmailelbob.xyz",
       "https://piped.projectsegfau.lt"
     ],
@@ -476,6 +477,8 @@
       "https://anon.sx",
       "https://dynabyte.ca",
       "https://jsearch.pw",
+      "https://northboot.xyz",
+      "https://search.affusio.com",
       "https://search.ethibox.fr",
       "https://search.snopyta.org",
       "https://search.stinpriza.org",
@@ -514,6 +517,8 @@
     ],
     "tor": [
       "http://3afisqjw2rxm6z7mmstyt5rx75qfqrgxnkzftknbp2vhipr2nrmrjdyd.onion",
+      "http://4n53nafyi77iplnbrpmxnp3x4exbswwxigujaxy3b37fvr7bvlopxeyd.onion",
+      "http://searchoorwalty5a2ailrboa2asqyts2u7bdoqwnjefpgjobpvtzn4qd.onion",
       "http://yra4tke2pwcnatxjkufpw6kvebu3h3ti2jca2lcdpgx3mpwol326lzid.onion",
       "http://z5vawdol25vrmorm4yydmohsd4u6rdoj2sylvoi3e3nqvxkvpqul7bqd.onion",
       "http://zbuc3bbzbfdqqo2x46repx2ddajbha6fpsjeeptjhhhhzji3zopxdqyd.onion",
@@ -531,7 +536,6 @@
       "https://de.xcxc.ml",
       "https://etsi.me",
       "https://jackgoss.xyz",
-      "https://northboot.xyz",
       "https://opnxng.com",
       "https://paulgo.io",
       "https://priv.au",
@@ -540,7 +544,6 @@
       "https://s.zhaocloud.net",
       "https://saber.tk",
       "https://search.0relay.com",
-      "https://search.affusio.com",
       "https://search.ashs.club",
       "https://search.bingowaves.xyz",
       "https://search.bus-hit.me",
@@ -586,6 +589,7 @@
       "https://searxng.zackptg5.com",
       "https://serx.ml",
       "https://sh0.it",
+      "https://soek.allesbeste.com",
       "https://srx.cosmohub.io",
       "https://swag.pw",
       "https://www.gruble.de",
@@ -595,10 +599,8 @@
     ],
     "tor": [
       "http://w5rl6wsd7mzj4bdkbuqvzidet5osdsm5jhg2f7nvfidakfq5exda5wid.onion",
-      "http://4n53nafyi77iplnbrpmxnp3x4exbswwxigujaxy3b37fvr7bvlopxeyd.onion",
       "http://b6sxmon57qza6dt36li7huabie5ntrvjr4q5rc2vvbn4hqvzd4phrvyd.onion",
       "http://search3q76rqpektbrchlf2rjq4fnbxzeov6rljdywg3nwbunpgd7bid.onion",
-      "http://searchoorwalty5a2ailrboa2asqyts2u7bdoqwnjefpgjobpvtzn4qd.onion",
       "http://gbat2pbpg7ys3fi3pbp64667tt5x66mg45xok35bxdw7v55brm7a27yd.onion",
       "http://searxdr3pqz4nydgnqocsia2xbywptxbkympa2emn7zlgggrir4bkfad.onion",
       "http://searx.micohauwkjbyw5meacrb4ipicwvwg4xtzl7y7viv53kig2mdcsvwkyyd.onion",
@@ -698,7 +700,8 @@
   },
   "beatbump": {
     "normal": [
-      "https://beatbump.ml"
+      "https://beatbump.ml",
+      "https://beatbump.esmailelbob.xyz"
     ],
     "tor": [],
     "i2p": [],
@@ -732,6 +735,8 @@
     "loki": []
   },
   "peertube": [
+    "https://kinotu.be",
+    "https://tube.nogafa.org",
     "https://www.neptube.io",
     "https://tube.ghk-academy.info",
     "https://pcbu.nl",
@@ -818,7 +823,6 @@
     "https://tube-enseignement-professionnel.apps.education.fr",
     "https://socpeertube.ru",
     "https://videos.laliguepaysdelaloire.org",
-    "https://videotube.duckdns.org",
     "https://quantube.win",
     "https://twctube.twc-zone.eu",
     "https://vhs.absturztau.be",
@@ -886,7 +890,6 @@
     "https://video.niboe.info",
     "https://peertuibe.fedsinfo.nohost.me",
     "https://s9.gegenstimme.tv",
-    "https://pocketnetpeertube1.nohost.me",
     "https://videos.alamaisondulibre.org",
     "https://videos.tormentasolar.win",
     "https://tube.nestor.coop",
@@ -947,7 +950,6 @@
     "https://pt.nospy.net",
     "https://yhwh.tube",
     "https://peerlook.ru",
-    "https://monero.wf",
     "https://tube.kicou.info",
     "https://video.aqr.af",
     "https://videos-passages.huma-num.fr",
@@ -1049,7 +1051,6 @@
     "https://ua.peertube.red",
     "https://peertube.zwindler.fr",
     "https://videos.fsci.in",
-    "https://swebbtube.se",
     "https://video.dnfi.no",
     "https://peertube.revelin.fr",
     "https://armstube.com",
@@ -1081,7 +1082,6 @@
     "https://peertube.home.x0r.fr",
     "https://peertube.marud.fr",
     "https://freetubehub.live",
-    "https://peertube.librelabucm.org",
     "https://mtube.mooo.com",
     "https://skeptube.fr",
     "https://tube.villejuif.fr",
diff --git a/src/instances/get_instances.py b/src/instances/get_instances.py
index 0d0e8c78..eab4a924 100644
--- a/src/instances/get_instances.py
+++ b/src/instances/get_instances.py
@@ -89,6 +89,19 @@ def is_authenticate(url):
         return False
     return False
 
+def is_offline(url):
+    try:
+        r = requests.get(url, timeout=5)
+        if r.status_code >= 400:
+            print(url + ' is ' + Fore.RED + 'offline' + Style.RESET_ALL)
+            print("Status code")
+            print(r.status_code)
+            return True
+        else:
+            return False
+    except:
+        return False
+
 
 def invidious():
     r = requests.get('https://api.invidious.io/instances.json')
@@ -635,6 +648,7 @@ mightyList = filterLastSlash(mightyList)
 
 cloudflare = []
 authenticate = []
+offline = []
 for k1, v1 in mightyList.items():
     if type(mightyList[k1]) is dict:
         for k2, v2 in mightyList[k1].items():
@@ -647,12 +661,15 @@ for k1, v1 in mightyList.items():
                         cloudflare.append(instance)
                     if not instance.endswith('.onion') and not instance.endswith('.i2p') and not instance.endswith('.loki') and is_authenticate(instance):
                         authenticate.append(instance)
+                    if not instance.endswith('.onion') and not instance.endswith('.i2p') and not instance.endswith('.loki') and is_offline(instance):
+                        offline.append(instance)
 
 peertube()
 
 blacklist = {
     'cloudflare': cloudflare,
-    'authenticate': authenticate
+    'authenticate': authenticate,
+    'offline': offline
 }
 
 # Writing to file
diff --git a/src/pages/background/background.js b/src/pages/background/background.js
index 359a912d..c6e9ab7a 100644
--- a/src/pages/background/background.js
+++ b/src/pages/background/background.js
@@ -32,25 +32,27 @@ browser.runtime.onInstalled.addListener(details => {
 				browser.storage.local.clear(() => {
 					browser.storage.local.set({ cloudflareBlackList: JSON.parse(data).cloudflare }, () => {
 						browser.storage.local.set({ authenticateBlackList: JSON.parse(data).authenticate }, () => {
-							generalHelper.initDefaults()
-							youtubeHelper.initDefaults()
-							youtubeMusicHelper.initDefaults()
-							twitterHelper.initDefaults()
-							instagramHelper.initDefaults()
-							mapsHelper.initDefaults()
-							searchHelper.initDefaults()
-							translateHelper.initDefaults()
-							mediumHelper.initDefaults()
-							quoraHelper.initDefaults()
-							libremdbHelper.initDefaults()
-							reutersHelper.initDefaults()
-							redditHelper.initDefaults()
-							wikipediaHelper.initDefaults()
-							imgurHelper.initDefaults()
-							tiktokHelper.initDefaults()
-							sendTargetsHelper.initDefaults()
-							peertubeHelper.initDefaults()
-							lbryHelper.initDefaults()
+							browser.storage.local.set({ offlineBlackList: JSON.parse(data).offline }, () => {
+								generalHelper.initDefaults()
+								youtubeHelper.initDefaults()
+								youtubeMusicHelper.initDefaults()
+								twitterHelper.initDefaults()
+								instagramHelper.initDefaults()
+								mapsHelper.initDefaults()
+								searchHelper.initDefaults()
+								translateHelper.initDefaults()
+								mediumHelper.initDefaults()
+								quoraHelper.initDefaults()
+								libremdbHelper.initDefaults()
+								reutersHelper.initDefaults()
+								redditHelper.initDefaults()
+								wikipediaHelper.initDefaults()
+								imgurHelper.initDefaults()
+								tiktokHelper.initDefaults()
+								sendTargetsHelper.initDefaults()
+								peertubeHelper.initDefaults()
+								lbryHelper.initDefaults()
+							})
 						})
 					})
 				})
@@ -71,17 +73,6 @@ browser.runtime.onInstalled.addListener(details => {
 	// }
 })
 
-youtubeHelper.pasteInvidiousCookies()
-translateHelper.pasteSimplyTranslateCookies()
-twitterHelper.pasteNitterCookies()
-wikipediaHelper.pasteWikilessCookies()
-searchHelper.pasteSearxCookies()
-searchHelper.pasteSearxngCookies()
-searchHelper.pasteLibrexCookies()
-redditHelper.pasteLibredditCookies()
-redditHelper.pasteTedditCookies()
-tiktokHelper.pasteProxiTokCookies()
-
 let BYPASSTABs = []
 browser.webRequest.onBeforeRequest.addListener(
 	details => {
diff --git a/src/pages/background/incognito.html b/src/pages/background/incognito.html
deleted file mode 100644
index 227d99e4..00000000
--- a/src/pages/background/incognito.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-	<head>
-		<meta charset="utf-8" />
-		<meta charset="UTF-8" />
-		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
-		<meta name="viewport" content="width=device-width, initial-scale=1" />
-		<title data-localise="__MSG_instanceIsOff__">Initializing Cookies</title>
-		<link href="../stylesheets/styles.css" rel="stylesheet" />
-		<style>
-			body {
-				margin: 0;
-				padding: 0;
-				height: 100vh;
-				width: 100vw;
-				flex-wrap: wrap;
-				justify-content: center;
-				align-items: center;
-				font-size: 30px;
-				display: flex;
-			}
-
-			div {
-				text-align: center;
-			}
-		</style>
-	</head>
-
-	<body>
-		<div>
-			<p>Initializing Cookies...</p>
-		</div>
-		<script type="module" src="incognito.js"></script>
-	</body>
-</html>
diff --git a/src/pages/background/incognito.js b/src/pages/background/incognito.js
deleted file mode 100644
index c7ed2b7d..00000000
--- a/src/pages/background/incognito.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import youtubeHelper from "../../assets/javascripts/youtube/youtube.js"
-import twitterHelper from "../../assets/javascripts/twitter.js"
-import redditHelper from "../../assets/javascripts/reddit.js"
-import searchHelper from "../../assets/javascripts/search.js"
-import translateHelper from "../../assets/javascripts/translate/translate.js"
-import wikipediaHelper from "../../assets/javascripts/wikipedia.js"
-import tiktokHelper from "../../assets/javascripts/tiktok.js"
-
-window.browser = window.browser || window.chrome
-
-await youtubeHelper.pasteInvidiousCookies()
-await translateHelper.pasteSimplyTranslateCookies()
-await twitterHelper.pasteNitterCookies()
-await wikipediaHelper.pasteWikilessCookies()
-await searchHelper.pasteSearxCookies()
-await searchHelper.pasteSearxngCookies()
-await searchHelper.pasteLibrexCookies()
-await redditHelper.pasteLibredditCookies()
-await redditHelper.pasteTedditCookies()
-await tiktokHelper.pasteProxiTokCookies()
-
-window.close()
diff --git a/src/pages/options/index.html b/src/pages/options/index.html
index a868ad3a..077b3da2 100644
--- a/src/pages/options/index.html
+++ b/src/pages/options/index.html
@@ -21,7 +21,7 @@
           <div class="title"> <img src="../../../assets/images/instagram-icon.png"><a href="#instagram" data-localise="__MSG_instagram__">Instagram</a></div>
           <div class="title"> <img src="../../../assets/images/tiktok-icon.png"><a href="#tiktok" data-localise="__MSG_tiktok__">TikTok</a></div>
           <div class="title"> <img src="../../../assets/images/reddit-icon.png"><a href="#reddit" data-localise="__MSG_reddit__">Reddit</a></div>
-          <div class="title"> <img src="../../../assets/images/imgur-icon.png"><a href="#imgur" data-localise="__MSG_imgur__">Imgur</a></div>
+          <div class="title"> <img src="../../../assets/images/imgur.png"><a href="#imgur" data-localise="__MSG_imgur__">Imgur</a></div>
           <div class="title"> <img src="../../../assets/images/wikipedia-icon.svg"><a href="#wikipedia" data-localise="__MSG_wikipedia__">Wikipedia</a></div>
           <div class="title"> 
                 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
@@ -34,7 +34,7 @@
           <div class="title"><img src="../../../assets/images/imdb.svg"><a href="#imdb" data-localise="__MSG_imdb__">IMDb</a></div>
           <div class="title"><img src="../../../assets/images/reuters.svg"><a href="#reuters" data-localise="__MSG_reuters__">Reuters</a></div>
           <div class="title"> <img src="../../../assets/images/peertube-icon.svg"><a href="#peertube" data-localise="__MSG_peertube__">PeerTube</a></div>
-          <div class="title"> <img src="../../../assets/images/lbry-icon.png"><a href="#lbry" data-localise="__MSG_lbry__">LBRY/Odysee</a></div>
+          <div class="title"> <img src="../../../assets/images/lbry-icon.png"><a href="#lbry" data-localise="__MSG_lbry__">LBRY</a></div>
           <div class="title"> 
                 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
                   <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
@@ -94,6 +94,13 @@
           <h4 data-localise="__MSG_autoRedirect__"></h4>
           <input id="auto-redirect" type="checkbox">
         </div>
+        <form>
+          <div class="some-block option-block">
+            <h4 data-localise="__MSG_latencyThreshold">Latency Threshold</h4>
+            <output id="latency-output" for="latencyInput" name="latencyOutput"></output>
+            <input id="latency-input" type="range" min="50" max="5000" value="1000" name="latencyInput" step="50">
+          </div>
+        </form>
         <div class="some-block option-block">
           <h4 data-localise="__MSG_exceptions__"></h4>
         </div>
@@ -173,7 +180,7 @@
             <input id="tiktok" type="checkbox">
           </div>
           <div> 
-            <div> <img src="../../../assets/images/imgur-icon.png">
+            <div> <img src="../../../assets/images/imgur.png">
               <x data-localise="__MSG_imgur__">Imgur</x>
             </div>
             <input id="imgur" type="checkbox">
@@ -254,7 +261,7 @@
           </div>
           <div> 
             <div> <img src="../../../assets/images/lbry-icon.png">
-              <x data-localise="__MSG_lbry__">LBRY/Odysee</x>
+              <x data-localise="__MSG_lbry__">LBRY</x>
             </div>
             <input id="lbry" type="checkbox">
           </div>
@@ -3179,4 +3186,4 @@
     </div>
   </body>
   <script type="module" src="./index.js"></script>
-</html>
\ No newline at end of file
+</html>
diff --git a/src/pages/options/index.pug b/src/pages/options/index.pug
index 553f918f..3711fdac 100644
--- a/src/pages/options/index.pug
+++ b/src/pages/options/index.pug
@@ -33,4 +33,4 @@ html#elementToShowWithJavaScript(lang="en")
             include ./widgets/sendTargets.pug
             include ./widgets/about.pug
 
-    script(type="module" src="./index.js")
\ No newline at end of file
+    script(type="module" src="./index.js")
diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js
index 5407159d..d6824251 100644
--- a/src/pages/options/widgets/general.js
+++ b/src/pages/options/widgets/general.js
@@ -56,31 +56,7 @@ importSettingsElement.addEventListener("change", () => {
 	reader.onload = async () => {
 		const data = JSON.parse(reader.result)
 		if ("theme" in data && "disableImgur" in data && "imgurRedirects" in data) {
-			browser.storage.local.clear(() => {
-				browser.storage.local.set({ ...data }, async () => {
-					await youtubeHelper.pasteInvidiousCookies()
-					await youtubeHelper.pastePipedLocalStorage()
-					await youtubeHelper.pastePipedMaterialLocalStorage()
-
-					await translateHelper.pasteSimplyTranslateCookies()
-					await translateHelper.pasteLingvaLocalStorage()
-
-					await twitterHelper.pasteNitterCookies()
-
-					await wikipediaHelper.pasteWikilessCookies()
-
-					await searchHelper.pasteSearxCookies()
-					await searchHelper.pasteSearxngCookies()
-					await searchHelper.pasteLibrexCookies()
-
-					await redditHelper.pasteLibredditCookies()
-					await redditHelper.pasteTedditCookies()
-
-					await tiktokHelper.pasteProxiTokCookies()
-
-					location.reload()
-				})
-			})
+			browser.storage.local.clear(() => browser.storage.local.set({ ...data }, () => location.reload()))
 		} else {
 			console.log("incompatible settings")
 			importError()
@@ -105,6 +81,7 @@ resetSettings.addEventListener("click", async () => {
 			.then(response => response.text())
 			.then(async data => {
 				browser.storage.local.set({ cloudflareBlackList: JSON.parse(data).cloudflare }, () => {
+					browser.storage.local.set({ offlineBlackList: JSON.parse(data).offline }, () => {
 					browser.storage.local.set({ authenticateBlackList: JSON.parse(data).authenticate }, async () => {
 						await generalHelper.initDefaults()
 						await youtubeHelper.initDefaults()
@@ -127,6 +104,7 @@ resetSettings.addEventListener("click", async () => {
 						await lbryHelper.initDefaults()
 						location.reload()
 					})
+					})
 				})
 			})
 	})
@@ -156,6 +134,15 @@ protocolFallbackCheckbox.addEventListener("change", event => {
 	browser.storage.local.set({ protocolFallback: event.target.checked })
 })
 
+let latencyOutput = document.getElementById("latency-output")
+let latencyInput = document.getElementById("latency-input")
+latencyInput.addEventListener("change", event => {
+	browser.storage.local.set({ latencyThreshold: event.target.value })
+})
+latencyInput.addEventListener("input", event => {
+	latencyOutput.value = event.target.value
+})
+
 let nameCustomInstanceInput = document.getElementById("exceptions-custom-instance")
 let instanceTypeElement = document.getElementById("exceptions-custom-instance-type")
 let instanceType = "url"
@@ -181,6 +168,7 @@ browser.storage.local.get(
 		"exceptions",
 		"protocol",
 		"protocolFallback",
+		"latencyThreshold",
 		// 'firstPartyIsolate'
 	],
 	r => {
@@ -188,6 +176,7 @@ browser.storage.local.get(
 		themeElement.value = r.theme
 		protocolElement.value = r.protocol
 		protocolFallbackCheckbox.checked = r.protocolFallback
+		latencyOutput.value = r.latencyThreshold
 		// firstPartyIsolate.checked = r.firstPartyIsolate;
 
 		let protocolFallbackElement = document.getElementById("protocol-fallback")
diff --git a/src/pages/options/widgets/general.pug b/src/pages/options/widgets/general.pug
index e04e9e2a..e523d5bb 100644
--- a/src/pages/options/widgets/general.pug
+++ b/src/pages/options/widgets/general.pug
@@ -31,6 +31,12 @@ section#general_page.option-block
         h4(data-localise="__MSG_autoRedirect__")
         input#auto-redirect(type="checkbox")
 
+    form
+        .some-block.option-block
+            h4(data-localise="__MSG_latencyThreshold") Latency Threshold
+            output#latency-output(for="latencyInput" name="latencyOutput")
+            input#latency-input(type="range" min="50" max="5000" value="1000" name="latencyInput" step="50")
+
     .some-block.option-block
         h4(data-localise="__MSG_exceptions__")
 
@@ -117,7 +123,7 @@ section#general_page.option-block
 
         div 
             div 
-                img(src="../../../assets/images/imgur-icon.png")
+                img(src="../../../assets/images/imgur.png")
                 x(data-localise="__MSG_imgur__") Imgur
             input#imgur(type="checkbox")
 
@@ -190,7 +196,7 @@ section#general_page.option-block
         div 
             div 
                 img(src="../../../assets/images/lbry-icon.png")
-                x(data-localise="__MSG_lbry__") LBRY/Odysee
+                x(data-localise="__MSG_lbry__") LBRY
             input#lbry(type="checkbox")
 
         div 
diff --git a/src/pages/popup/popup.html b/src/pages/popup/popup.html
index 7493ecbe..25f70f48 100644
--- a/src/pages/popup/popup.html
+++ b/src/pages/popup/popup.html
@@ -28,7 +28,7 @@
           <h4 data-localise="__MSG_tiktok__">TikTok</h4></a>
         <input class="disable-tiktok" type="checkbox"/>
       </div>
-      <div class="imgur some-block"><a class="title" href="https://imgur.com"><img src="../../assets/images/imgur-icon.png"/>
+      <div class="imgur some-block"><a class="title" href="https://imgur.com"><img src="../../assets/images/imgur.png"/>
           <h4 data-localise="__MSG_imgur__">Imgur</h4></a>
         <input class="disable-imgur" type="checkbox"/>
       </div>
@@ -122,7 +122,7 @@
           <h4 data-localise="__MSG_tiktok__">TikTok</h4></a>
         <input class="disable-tiktok" type="checkbox"/>
       </div>
-      <div class="imgur some-block"><a class="title" href="https://imgur.com"><img src="../../assets/images/imgur-icon.png"/>
+      <div class="imgur some-block"><a class="title" href="https://imgur.com"><img src="../../assets/images/imgur.png"/>
           <h4 data-localise="__MSG_imgur__">Imgur</h4></a>
         <input class="disable-imgur" type="checkbox"/>
       </div>
diff --git a/src/pages/popup/popup.pug b/src/pages/popup/popup.pug
index cd4d3713..7da687cc 100644
--- a/src/pages/popup/popup.pug
+++ b/src/pages/popup/popup.pug
@@ -33,7 +33,7 @@ mixin services
 
     .imgur.some-block
         a.title(href="https://imgur.com")
-            img(src="../../assets/images/imgur-icon.png")
+            img(src="../../assets/images/imgur.png")
             h4(data-localise="__MSG_imgur__") Imgur
         input.disable-imgur(type="checkbox")
 
diff --git a/src/pages/widgets/links.pug b/src/pages/widgets/links.pug
index cac2ecb3..c7f8e0a6 100644
--- a/src/pages/widgets/links.pug
+++ b/src/pages/widgets/links.pug
@@ -31,7 +31,7 @@ mixin links(service)
             a(href="#reddit" data-localise="__MSG_reddit__") Reddit
 
         .title 
-            img(src="../../../assets/images/imgur-icon.png")
+            img(src="../../../assets/images/imgur.png")
             a(href="#imgur" data-localise="__MSG_imgur__") Imgur
 
         .title 
@@ -60,7 +60,7 @@ mixin links(service)
 
         .title 
             img(src="../../../assets/images/lbry-icon.png")
-            a(href="#lbry" data-localise="__MSG_lbry__") LBRY/Odysee
+            a(href="#lbry" data-localise="__MSG_lbry__") LBRY
 
         .title 
             +search
@@ -80,4 +80,4 @@ mixin links(service)
         
         .title
             +about
-            a(href="#about" data-localise="__MSG_about") About
\ No newline at end of file
+            a(href="#about" data-localise="__MSG_about") About