about summary refs log tree commit diff stats
path: root/src/assets
diff options
context:
space:
mode:
Diffstat (limited to 'src/assets')
-rw-r--r--src/assets/javascripts/general.js2
-rw-r--r--src/assets/javascripts/imdb.js49
-rw-r--r--src/assets/javascripts/imgur.js51
-rw-r--r--src/assets/javascripts/instagram.js53
-rw-r--r--src/assets/javascripts/lbry.js95
-rw-r--r--src/assets/javascripts/medium.js52
-rw-r--r--src/assets/javascripts/peertube.js31
-rw-r--r--src/assets/javascripts/quora.js46
-rw-r--r--src/assets/javascripts/reddit.js88
-rw-r--r--src/assets/javascripts/reuters.js33
-rw-r--r--src/assets/javascripts/search.js145
-rw-r--r--src/assets/javascripts/sendTargets.js47
-rw-r--r--src/assets/javascripts/tiktok.js62
-rw-r--r--src/assets/javascripts/translate/translate.js146
-rw-r--r--src/assets/javascripts/twitter.js65
-rw-r--r--src/assets/javascripts/utils.js9
-rw-r--r--src/assets/javascripts/wikipedia.js75
-rw-r--r--src/assets/javascripts/youtube/youtube.js155
18 files changed, 703 insertions, 501 deletions
diff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js
index f778d876..1c27a55d 100644
--- a/src/assets/javascripts/general.js
+++ b/src/assets/javascripts/general.js
@@ -44,6 +44,8 @@ async function initDefaults() {
             ],
             autoRedirect: false,
             firstPartyIsolate: false,
+            protocol: "normal",
+            protocolFallback: true
         }, () => resolve())
     )
 }
diff --git a/src/assets/javascripts/imdb.js b/src/assets/javascripts/imdb.js
index 0061b7e3..de1293af 100644
--- a/src/assets/javascripts/imdb.js
+++ b/src/assets/javascripts/imdb.js
@@ -3,15 +3,21 @@ window.browser = window.browser || window.chrome;
 import utils from './utils.js'
 
 const targets = [
-    /^https?:\/{2}(www\.|)imdb\.com.*/
+    /^https?:\/{2}(?:www\.|)imdb\.com.*/
 ];
 
-let redirects = {
-    "libremdb": {
-        "normal": [],
-        "tor": []
+const frontends = new Array("libremdb")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {}
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
     }
 }
+
 function setRedirects(val) {
     browser.storage.local.get('cloudflareBlackList', r => {
         redirects.libremdb = val;
@@ -29,7 +35,8 @@ function setRedirects(val) {
 
 let
     disableImdb,
-    imdbProtocol,
+    protocol,
+    protocolFallback,
     imdbRedirects,
     libremdbNormalRedirectsChecks,
     libremdbNormalCustomRedirects,
@@ -41,7 +48,8 @@ function init() {
         browser.storage.local.get(
             [
                 "disableImdb",
-                "imdbProtocol",
+                "protocol",
+                "protocolFallback",
                 "imdbRedirects",
                 "libremdbNormalRedirectsChecks",
                 "libremdbNormalCustomRedirects",
@@ -50,7 +58,8 @@ function init() {
             ],
             r => {
                 disableImdb = r.disableImdb;
-                imdbProtocol = r.imdbProtocol;
+                protocol = r.protocol;
+                protocolFallback = r.protocolFallback;
                 imdbRedirects = r.imdbRedirects;
                 libremdbNormalRedirectsChecks = r.libremdbNormalRedirectsChecks;
                 libremdbNormalCustomRedirects = r.libremdbNormalCustomRedirects;
@@ -76,10 +85,12 @@ function redirect(url, type, initiator, disableOverride) {
     if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return;
     if (!targets.some(rx => rx.test(url.href))) return;
 
-    let instancesList;
-    if (imdbProtocol == 'normal') instancesList = [...libremdbNormalRedirectsChecks, ...libremdbNormalCustomRedirects];
-    if (imdbProtocol == 'tor') instancesList = [...libremdbTorRedirectsChecks, ...libremdbTorCustomRedirects];
-    if (instancesList.length === 0) return;
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...libremdbTorRedirectsChecks, ...libremdbTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...libremdbNormalRedirectsChecks, ...libremdbNormalCustomRedirects];
+    }
+    if (instancesList.length === 0) { return; }
 
     const randomInstance = utils.getRandomInstance(instancesList);
     return `${randomInstance}${url.pathname}`;
@@ -115,9 +126,11 @@ function switchInstance(url, disableOverride) {
         ];
         if (!all.includes(protocolHost)) { resolve(); return; }
 
-        let instancesList;
-        if (imdbProtocol == 'normal') instancesList = [...libremdbNormalCustomRedirects, ...libremdbNormalRedirectsChecks];
-        else if (imdbProtocol == 'tor') instancesList = [...libremdbTorCustomRedirects, ...libremdbTorRedirectsChecks];
+        let instancesList = [];
+        if (protocol == 'tor') instancesList = [...libremdbTorRedirectsChecks, ...libremdbTorCustomRedirects];
+        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+            instancesList = [...libremdbNormalRedirectsChecks, ...libremdbNormalCustomRedirects];
+        }
 
         const i = instancesList.indexOf(protocolHost);
         if (i > -1) instancesList.splice(i, 1);
@@ -132,11 +145,11 @@ function initDefaults() {
     return new Promise(async resolve => {
         fetch('/instances/data.json').then(response => response.text()).then(async data => {
             let dataJson = JSON.parse(data);
-            redirects.libremdb = dataJson.libremdb;
+            for (let i = 0; i < frontends.length; i++) {
+                redirects[frontends[i]] = dataJson[frontends[i]]
+            }
             browser.storage.local.set({
                 disableImdb: true,
-                imdbProtocol: "normal",
-
                 imdbRedirects: redirects,
 
                 libremdbNormalRedirectsChecks: [...redirects.libremdb.normal],
diff --git a/src/assets/javascripts/imgur.js b/src/assets/javascripts/imgur.js
index 8cf54265..dafebb9c 100644
--- a/src/assets/javascripts/imgur.js
+++ b/src/assets/javascripts/imgur.js
@@ -4,13 +4,18 @@ import utils from './utils.js'
 
 const targets = /^https?:\/{2}([im]\.)?imgur\.(com|io)(\/|$)/
 
-let redirects = {
-    "rimgo": {
-        "normal": [],
-        "tor": [],
-        "i2p": []
+const frontends = new Array("rimgo")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {}
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
     }
 }
+
 function setRedirects() {
     return new Promise(resolve => {
         fetch('/instances/data.json').then(response => response.text()).then(async data => {
@@ -45,7 +50,8 @@ function setRedirects() {
 let
     disableImgur,
     imgurRedirects,
-    imgurProtocol,
+    protocol,
+    protocolFallback,
     rimgoNormalRedirectsChecks,
     rimgoNormalCustomRedirects,
     rimgoTorRedirectsChecks,
@@ -59,7 +65,8 @@ function init() {
             [
                 "disableImgur",
                 "imgurRedirects",
-                "imgurProtocol",
+                "protocol",
+                "protocolFallback",
                 "rimgoNormalRedirectsChecks",
                 "rimgoNormalCustomRedirects",
                 "rimgoTorRedirectsChecks",
@@ -70,7 +77,8 @@ function init() {
             r => {
                 disableImgur = r.disableImgur;
                 imgurRedirects = r.imgurRedirects;
-                imgurProtocol = r.imgurProtocol;
+                protocol = r.protocol;
+                protocolFallback = r.protocolFallback;
                 rimgoNormalRedirectsChecks = r.rimgoNormalRedirectsChecks;
                 rimgoNormalCustomRedirects = r.rimgoNormalCustomRedirects;
                 rimgoTorRedirectsChecks = r.rimgoTorRedirectsChecks;
@@ -111,11 +119,13 @@ function redirect(url, type, initiator, disableOverride) {
     if (!targets.test(url.href)) return;
     if (url.pathname.includes("delete/")) return;
 
-    let instancesList;
-    if (imgurProtocol == 'normal') instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects];
-    if (imgurProtocol == 'tor') instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects];
-    if (imgurProtocol == 'i2p') instancesList = [...rimgoI2pRedirectsChecks, ...rimgoI2pCustomRedirects];
-    if (instancesList.length === 0) return;
+    let instancesList = [];
+    if (protocol == 'i2p') instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks];
+    if (protocol == 'tor') instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects];
+    }
+    if (instancesList.length === 0) { return; }
 
     const randomInstance = utils.getRandomInstance(instancesList);
     return `${randomInstance}${url.pathname}${url.search}`;
@@ -136,10 +146,12 @@ function switchInstance(url, disableOverride) {
         if (disableImgur && !disableOverride) { resolve(); return; }
         let protocolHost = utils.protocolHost(url);
         if (!all().includes(protocolHost)) { resolve(); return; }
-        let instancesList;
-        if (imgurProtocol == 'normal') instancesList = [...rimgoNormalCustomRedirects, ...rimgoNormalRedirectsChecks];
-        else if (imgurProtocol == 'tor') instancesList = [...rimgoTorCustomRedirects, ...rimgoTorRedirectsChecks];
-        else if (imgurProtocol == 'i2p') instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks];
+        let instancesList = [];
+        if (protocol == 'i2p') instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks];
+        if (protocol == 'tor') instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects];
+        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+            instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects];
+        }
 
         const i = instancesList.indexOf(protocolHost);
         if (i > -1) instancesList.splice(i, 1);
@@ -154,7 +166,9 @@ function initDefaults() {
     return new Promise(resolve => {
         fetch('/instances/data.json').then(response => response.text()).then(async data => {
             let dataJson = JSON.parse(data);
-            redirects.rimgo = dataJson.rimgo;
+            for (let i = 0; i < frontends.length; i++) {
+                redirects[frontends[i]] = dataJson[frontends[i]]
+            }
             browser.storage.local.get('cloudflareBlackList', async r => {
                 rimgoNormalRedirectsChecks = [...redirects.rimgo.normal];
                 for (const instance of r.cloudflareBlackList) {
@@ -163,7 +177,6 @@ function initDefaults() {
                 }
                 browser.storage.local.set({
                     disableImgur: false,
-                    imgurProtocol: 'normal',
                     imgurRedirects: redirects,
 
                     rimgoNormalRedirectsChecks: rimgoNormalRedirectsChecks,
diff --git a/src/assets/javascripts/instagram.js b/src/assets/javascripts/instagram.js
index 7fa69200..e1c4061b 100644
--- a/src/assets/javascripts/instagram.js
+++ b/src/assets/javascripts/instagram.js
@@ -5,12 +5,19 @@ const targets = [
   "instagram.com",
   "www.instagram.com",
 ];
-let redirects = {
-  "bibliogram": {
-    "normal": [],
-    "tor": []
-  }
-};
+
+const frontends = new Array("bibliogram")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {};
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
+    }
+}
+
 function setRedirects(val) {
   browser.storage.local.get('cloudflareBlackList', async r => {
     redirects.bibliogram = val;
@@ -28,7 +35,8 @@ function setRedirects(val) {
 
 let
   disableInstagram,
-  instagramProtocol,
+  protocol,
+  protocolFallback,
   instagramRedirects,
   bibliogramNormalRedirectsChecks,
   bibliogramTorRedirectsChecks,
@@ -40,7 +48,8 @@ function init() {
     browser.storage.local.get(
       [
         "disableInstagram",
-        "instagramProtocol",
+        "protocol",
+        "protocolFallback",
         "instagramRedirects",
         "bibliogramNormalRedirectsChecks",
         "bibliogramTorRedirectsChecks",
@@ -49,7 +58,8 @@ function init() {
       ],
       r => {
         disableInstagram = r.disableInstagram;
-        instagramProtocol = r.instagramProtocol;
+        protocol = r.protocol;
+        protocolFallback = r.protocolFallback;
         instagramRedirects = r.instagramRedirects;
         bibliogramNormalRedirectsChecks = r.bibliogramNormalRedirectsChecks;
         bibliogramTorRedirectsChecks = r.bibliogramTorRedirectsChecks;
@@ -82,10 +92,12 @@ function redirect(url, type, initiator, disableOverride) {
   const bypassPaths = [/about/, /explore/, /support/, /press/, /api/, /privacy/, /safety/, /admin/, /\/(accounts\/|embeds?.js)/];
   if (bypassPaths.some(rx => rx.test(url.pathname))) return;
 
-  let instancesList;
-  if (instagramProtocol == 'normal') instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects];
-  else if (instagramProtocol == 'tor') instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects];
-  if (instancesList.length === 0) return;
+  let instancesList = [];
+  if (protocol == 'tor') instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects];
+  if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+    instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects];
+  }
+  if (instancesList.length === 0) { return; }
   let randomInstance = utils.getRandomInstance(instancesList)
 
   const reservedPaths = ["u", "p", "privacy",];
@@ -116,9 +128,11 @@ function switchInstance(url, disableOverride) {
     let protocolHost = utils.protocolHost(url);
     if (!all().includes(protocolHost)) { resolve(); return; }
 
-    let instancesList;
-    if (instagramProtocol == 'normal') instancesList = [...bibliogramNormalCustomRedirects, ...bibliogramNormalRedirectsChecks];
-    else if (instagramProtocol == 'tor') instancesList = [...bibliogramTorCustomRedirects, ...bibliogramTorRedirectsChecks];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects];
+    }
 
     const i = instancesList.indexOf(protocolHost);
     if (i > -1) instancesList.splice(i, 1);
@@ -133,7 +147,9 @@ function initDefaults() {
   return new Promise(resolve => {
     fetch('/instances/data.json').then(response => response.text()).then(data => {
       let dataJson = JSON.parse(data);
-      redirects.bibliogram = dataJson.bibliogram;
+      for (let i = 0; i < frontends.length; i++) {
+        redirects[frontends[i]] = dataJson[frontends[i]]
+      }
       browser.storage.local.get('cloudflareBlackList', r => {
         bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal];
         for (const instance of r.cloudflareBlackList) {
@@ -148,8 +164,7 @@ function initDefaults() {
           bibliogramTorRedirectsChecks: [],
 
           bibliogramNormalCustomRedirects: [...redirects.bibliogram.tor],
-          bibliogramTorCustomRedirects: [],
-          instagramProtocol: "normal",
+          bibliogramTorCustomRedirects: []
         })
         resolve();
       }
diff --git a/src/assets/javascripts/lbry.js b/src/assets/javascripts/lbry.js
index 77a8e4ec..7a298fbe 100644
--- a/src/assets/javascripts/lbry.js
+++ b/src/assets/javascripts/lbry.js
@@ -4,44 +4,36 @@ import utils from './utils.js'
 
 let targets = ["odysee.com"];
 
-let redirects = {
-    "librarian": {
-        "normal": [
-            "https://lbry.bcow.xyz",
-            "https://odysee.076.ne.jp",
-            "https://lbry.ix.tc",
-            "https://librarian.pussthecat.org",
-            "https://lbry.mutahar.rocks",
-            "https://librarian.esmailelbob.xyz",
-        ],
-        "tor": [
-            "http://ecc5mi5ncdw6mxhjz6re6g2uevtpbzxjvxgrxia2gyvrlnil3srbnhyd.onion",
-            "http://vrmbc4brkgkaysmi3fenbzkayobxjh24slmhtocambn3ewe62iuqt3yd.onion",
-        ]
+const frontends = new Array("librarian")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {}
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
     }
 }
 
 function setRedirects(val) {
-    redirects.librarian = val;
-    browser.storage.local.set({ lbryTargetsRedirects: redirects })
-    for (const item of librarianNormalRedirectsChecks)
-        if (!redirects.librarian.normal.includes(item)) {
-            var index = librarianNormalRedirectsChecks.indexOf(item);
-            if (index !== -1) librarianNormalRedirectsChecks.splice(index, 1);
-        }
-    browser.storage.local.set(librarianNormalRedirectsChecks);
-
-    for (const item of librarianTorRedirectsChecks)
-        if (!redirects.librarian.normal.includes(item)) {
-            var index = librarianTorRedirectsChecks.indexOf(item);
-            if (index !== -1) librarianTorRedirectsChecks.splice(index, 1);
+    browser.storage.local.get('cloudflareBlackList', r => {
+        redirects.librarian = val;
+        librarianNormalRedirectsChecks = [...redirects.librarian.normal];
+        for (const instance of r.cloudflareBlackList) {
+            const a = librarianNormalRedirectsChecks.indexOf(instance);
+            if (a > -1) librarianNormalRedirectsChecks.splice(a, 1);
         }
-    browser.storage.local.set(librarianTorRedirectsChecks)
+        browser.storage.local.set({
+            lbryTargetsRedirects: redirects,
+            librarianNormalRedirectsChecks
+        })
+    })
 }
 
 let
     disableLbryTargets,
-    lbryTargetsProtocol,
+    protocol,
     lbryTargetsRedirects,
     librarianNormalRedirectsChecks,
     librarianNormalCustomRedirects,
@@ -53,7 +45,7 @@ function init() {
         browser.storage.local.get(
             [
                 "disableLbryTargets",
-                "lbryTargetsProtocol",
+                "protocol",
                 "lbryTargetsRedirects",
                 "librarianNormalRedirectsChecks",
                 "librarianNormalCustomRedirects",
@@ -62,7 +54,7 @@ function init() {
             ],
             r => {
                 disableLbryTargets = r.disableLbryTargets;
-                lbryTargetsProtocol = r.lbryTargetsProtocol;
+                protocol = r.protocol;
                 lbryTargetsRedirects = r.lbryTargetsRedirects;
                 librarianNormalRedirectsChecks = r.librarianNormalRedirectsChecks;
                 librarianNormalCustomRedirects = r.librarianNormalCustomRedirects;
@@ -92,9 +84,11 @@ function switchInstance(url, disableOverride) {
         const protocolHost = utils.protocolHost(url);
         if (!all().includes(protocolHost)) { resolve(); return; }
 
-        let instancesList;
-        if (lbryTargetsProtocol == 'normal') instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects];
-        else if (lbryTargetsProtocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects];
+        let instancesList = [];
+        if (protocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects];
+        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+            instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects];
+        }
 
         const i = instancesList.indexOf(protocolHost);
         if (i > -1) instancesList.splice(i, 1);
@@ -111,9 +105,11 @@ function redirect(url, type, initiator, disableOverride) {
     if (!targets.includes(url.host)) return;
     if (type != "main_frame") return;
 
-    let instancesList;
-    if (lbryTargetsProtocol == 'normal') instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects];
-    if (lbryTargetsProtocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects];
+    }
     if (instancesList.length === 0) return;
 
     const randomInstance = utils.getRandomInstance(instancesList);
@@ -121,31 +117,24 @@ function redirect(url, type, initiator, disableOverride) {
 }
 
 function initDefaults() {
-    return new Promise(resolve => {
-        browser.storage.local.get('cloudflareBlackList', async r => {
-            librarianNormalRedirectsChecks = [...redirects.librarian.normal];
-            for (const instance of r.cloudflareBlackList) {
-                let i;
-
-                i = librarianNormalRedirectsChecks.indexOf(instance);
-                if (i > -1) librarianNormalRedirectsChecks.splice(i, 1);
+    return new Promise(async resolve => {
+        fetch('/instances/data.json').then(response => response.text()).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.set({
                 disableLbryTargets: true,
-                lbryTargetsRedirects: {
-                    'librarian': redirects.librarian
-                },
+
+                lbryTargetsRedirects: redirects,
 
                 librarianNormalRedirectsChecks: librarianNormalRedirectsChecks,
                 librarianNormalCustomRedirects: [],
 
                 librarianTorRedirectsChecks: [...redirects.librarian.tor],
                 librarianTorCustomRedirects: [],
-
-                lbryTargetsProtocol: "normal",
-            }, () => resolve())
-
-        })
+            }, () => resolve());
+        });
     })
 }
 
diff --git a/src/assets/javascripts/medium.js b/src/assets/javascripts/medium.js
index 5d688b23..37a8a3db 100644
--- a/src/assets/javascripts/medium.js
+++ b/src/assets/javascripts/medium.js
@@ -1,7 +1,6 @@
 window.browser = window.browser || window.chrome;
 import utils from './utils.js'
 
-
 const targets = [
   // /(?:.*\.)*(?<!(link\.|cdn\-images\-\d+\.))medium\.com(\/.*)?$/,
   /^medium\.com/,
@@ -28,12 +27,18 @@ const targets = [
   /^ writingcooperative\.com /,
 ];
 
-let redirects = {
-  "scribe": {
-    "normal": [],
-    "tor": []
-  }
-};
+const frontends = new Array("scribe")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {};
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
+    }
+}
+
 function setRedirects(val) {
   browser.storage.local.get('cloudflareBlackList', r => {
     redirects.scribe = val;
@@ -56,7 +61,8 @@ let
   scribeNormalCustomRedirects,
   scribeTorRedirectsChecks,
   scribeTorCustomRedirects,
-  mediumProtocol;
+  protocol,
+  protocolFallback;
 
 function init() {
   return new Promise(resolve => {
@@ -68,7 +74,8 @@ function init() {
         "scribeNormalCustomRedirects",
         "scribeTorRedirectsChecks",
         "scribeTorCustomRedirects",
-        "mediumProtocol"
+        "protocol",
+        "protocolFallback"
       ],
       r => {
         disableMedium = r.disableMedium;
@@ -77,7 +84,8 @@ function init() {
         scribeNormalCustomRedirects = r.scribeNormalCustomRedirects;
         scribeTorRedirectsChecks = r.scribeTorRedirectsChecks;
         scribeTorCustomRedirects = r.scribeTorCustomRedirects;
-        mediumProtocol = r.mediumProtocol;
+        protocol = r.protocol;
+        protocolFallback = r.protocolFallback;
         resolve();
       }
     )
@@ -102,10 +110,12 @@ function redirect(url, type, initiator, disableOverride) {
   if (!targets.some(rx => rx.test(url.host))) return;
   if (/^\/(@[a-zA-Z.]{0,}(\/|)$)/.test(url.pathname)) return;
 
-  let instancesList;
-  if (mediumProtocol == 'normal') instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects];
-  else if (mediumProtocol == 'tor') instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects];
-  if (instancesList.length === 0) return;
+  let instancesList = [];
+  if (protocol == 'tor') instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects];
+  if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+    instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects];
+  }
+  if (instancesList.length === 0) { return; }
 
   const randomInstance = utils.getRandomInstance(instancesList)
   return `${randomInstance}${url.pathname}${url.search}`;
@@ -125,9 +135,11 @@ function switchInstance(url, disableOverride) {
     ];
     if (!all.includes(protocolHost)) { resolve(); return; }
 
-    let instancesList;
-    if (mediumProtocol == 'normal') instancesList = [...scribeNormalCustomRedirects, ...scribeNormalRedirectsChecks];
-    else if (mediumProtocol == 'tor') instancesList = [...scribeTorCustomRedirects, ...scribeTorRedirectsChecks];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects];
+    }
 
     const i = instancesList.indexOf(protocolHost);
     if (i > -1) instancesList.splice(i, 1);
@@ -142,7 +154,9 @@ function initDefaults() {
   return new Promise(resolve => {
     fetch('/instances/data.json').then(response => response.text()).then(data => {
       let dataJson = JSON.parse(data);
-      redirects.scribe = dataJson.scribe;
+      for (let i = 0; i < frontends.length; i++) {
+        redirects[frontends[i]] = dataJson[frontends[i]]
+      }
       browser.storage.local.get('cloudflareBlackList',
         async r => {
           scribeNormalRedirectsChecks = [...redirects.scribe.normal];
@@ -159,8 +173,6 @@ function initDefaults() {
 
             scribeTorRedirectsChecks: [...redirects.scribe.tor],
             scribeTorCustomRedirects: [],
-
-            mediumProtocol: "normal",
           }, () => resolve())
         })
     })
diff --git a/src/assets/javascripts/peertube.js b/src/assets/javascripts/peertube.js
index 8b7414e8..b397f972 100644
--- a/src/assets/javascripts/peertube.js
+++ b/src/assets/javascripts/peertube.js
@@ -40,7 +40,8 @@ let
     simpleertubeTorRedirectsChecks,
     simpleertubeTorCustomRedirects,
     peerTubeTargets,
-    peertubeTargetsProtocol;
+    protocol,
+    protocolFallback;
 
 function init() {
     return new Promise(resolve => {
@@ -53,7 +54,8 @@ function init() {
                 "simpleertubeTorRedirectsChecks",
                 "simpleertubeTorCustomRedirects",
                 "peerTubeTargets",
-                "peertubeTargetsProtocol"
+                "protocol",
+                "protocolFallback"
             ],
             r => {
                 disablePeertubeTargets = r.disablePeertubeTargets;
@@ -63,7 +65,8 @@ function init() {
                 simpleertubeTorRedirectsChecks = r.simpleertubeTorRedirectsChecks;
                 simpleertubeTorCustomRedirects = r.simpleertubeTorCustomRedirects;
                 peerTubeTargets = r.peerTubeTargets;
-                peertubeTargetsProtocol = r.peertubeTargetsProtocol;
+                protocol = r.protocol;
+                protocolFallback = r.protocolFallback;
                 resolve();
             }
         )
@@ -89,10 +92,12 @@ function redirect(url, type, initiator, disableOverride) {
     if (!peerTubeTargets.includes(protocolHost)) return;
     if (type != "main_frame") return;
 
-    let instancesList;
-    if (peertubeTargetsProtocol == 'normal') instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects];
-    if (peertubeTargetsProtocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects];
-    if (instancesList.length === 0) return;
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects];
+    }
+    if (instancesList.length === 0) { return; }
 
     const randomInstance = utils.getRandomInstance(instancesList);
     if (url.host == 'search.joinpeertube.org' || url.host == 'sepiasearch.org') return randomInstance;
@@ -106,9 +111,11 @@ function switchInstance(url, disableOverride) {
         const protocolHost = utils.protocolHost(url);
         if (!all().includes(protocolHost)) { resolve(); return; }
 
-        let instancesList;
-        if (peertubeTargetsProtocol == 'normal') instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects];
-        else if (peertubeTargetsProtocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects];
+        let instancesList = [];
+        if (protocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects];
+        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+            instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects];
+        }
 
         const i = instancesList.indexOf(protocolHost);
         if (i > -1) instancesList.splice(i, 1);
@@ -138,9 +145,7 @@ function initDefaults() {
                     simpleertubeNormalCustomRedirects: [],
 
                     simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor],
-                    simpleertubeTorCustomRedirects: [],
-
-                    peertubeTargetsProtocol: "normal",
+                    simpleertubeTorCustomRedirects: []
                 }, () => resolve());
             })
         })
diff --git a/src/assets/javascripts/quora.js b/src/assets/javascripts/quora.js
index 5f33f08d..aa907368 100644
--- a/src/assets/javascripts/quora.js
+++ b/src/assets/javascripts/quora.js
@@ -6,12 +6,18 @@ const targets = [
     /^https?:\/{2}(www\.|)quora\.com.*/
 ];
 
-let redirects = {
-    "quetre": {
-        "normal": [],
-        "tor": []
+let redirects = {}
+
+const frontends = new Array("quetre")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
     }
 }
+
 function setRedirects(val) {
     browser.storage.local.get('cloudflareBlackList', r => {
         redirects.quetre = val;
@@ -29,7 +35,8 @@ function setRedirects(val) {
 
 let
     disableQuora,
-    quoraProtocol,
+    protocol,
+    protocolFallback,
     quoraRedirects,
     quetreNormalRedirectsChecks,
     quetreNormalCustomRedirects,
@@ -41,7 +48,8 @@ function init() {
         browser.storage.local.get(
             [
                 "disableQuora",
-                "quoraProtocol",
+                "protocol",
+                "protocolFallback",
                 "quoraRedirects",
                 "quetreNormalRedirectsChecks",
                 "quetreNormalCustomRedirects",
@@ -50,7 +58,8 @@ function init() {
             ],
             r => {
                 disableQuora = r.disableQuora;
-                quoraProtocol = r.quoraProtocol;
+                protocol = r.protocol;
+                protocolFallback = r.protocolFallback;
                 quoraRedirects = r.quoraRedirects;
                 quetreNormalRedirectsChecks = r.quetreNormalRedirectsChecks;
                 quetreNormalCustomRedirects = r.quetreNormalCustomRedirects;
@@ -76,10 +85,12 @@ function redirect(url, type, initiator, disableOverride) {
     if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return;
     if (!targets.some(rx => rx.test(url.href))) return;
 
-    let instancesList;
-    if (quoraProtocol == 'normal') instancesList = [...quetreNormalRedirectsChecks, ...quetreNormalCustomRedirects];
-    if (quoraProtocol == 'tor') instancesList = [...quetreTorRedirectsChecks, ...quetreTorCustomRedirects];
-    if (instancesList.length === 0) return;
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...quetreTorRedirectsChecks, ...quetreTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...quetreNormalRedirectsChecks, ...quetreNormalCustomRedirects];
+    }
+    if (instancesList.length === 0) { return; }
 
     const randomInstance = utils.getRandomInstance(instancesList);
     return `${randomInstance}${url.pathname}`;
@@ -115,9 +126,11 @@ function switchInstance(url, disableOverride) {
         ];
         if (!all.includes(protocolHost)) { resolve(); return; }
 
-        let instancesList;
-        if (quoraProtocol == 'normal') instancesList = [...quetreNormalCustomRedirects, ...quetreNormalRedirectsChecks];
-        else if (quoraProtocol == 'tor') instancesList = [...quetreTorCustomRedirects, ...quetreTorRedirectsChecks];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...quetreTorRedirectsChecks, ...quetreTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...quetreNormalRedirectsChecks, ...quetreNormalCustomRedirects];
+    }
 
         const i = instancesList.indexOf(protocolHost);
         if (i > -1) instancesList.splice(i, 1);
@@ -132,10 +145,11 @@ function initDefaults() {
     return new Promise(async resolve => {
         fetch('/instances/data.json').then(response => response.text()).then(async data => {
             let dataJson = JSON.parse(data);
-            redirects.quetre = dataJson.quetre;
+            for (let i = 0; i < frontends.length; i++) {
+                redirects[frontends[i]] = dataJson[frontends[i]]
+            }
             browser.storage.local.set({
                 disableQuora: false,
-                quoraProtocol: "normal",
 
                 quoraRedirects: redirects,
 
diff --git a/src/assets/javascripts/reddit.js b/src/assets/javascripts/reddit.js
index e1f910c3..f43d88dd 100644
--- a/src/assets/javascripts/reddit.js
+++ b/src/assets/javascripts/reddit.js
@@ -6,16 +6,18 @@ const targets = [
   /^https?:\/{2}(www\.|old\.|np\.|new\.|amp\.|)reddit\.com/,
   /^https?:\/{2}(i\.|preview\.)redd\.it/,
 ];
-let redirects = {
-  "libreddit": {
-    "normal": [],
-    "tor": []
-  },
-  "teddit": {
-    "normal": [],
-    "tor": []
-  },
-};
+let redirects = {};
+
+const frontends = new Array("libreddit", "teddit")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
+    }
+}
+
 function setRedirects(val) {
   browser.storage.local.get('cloudflareBlackList', r => {
     redirects = val;
@@ -40,7 +42,7 @@ let
   disableReddit,
   redditFrontend,
   redditRedirects,
-  redditProtocol,
+  protocol,
   libredditNormalRedirectsChecks,
   libredditNormalCustomRedirects,
   libredditTorRedirectsChecks,
@@ -57,7 +59,7 @@ function init() {
         "disableReddit",
         "redditFrontend",
         "redditRedirects",
-        "redditProtocol",
+        "protocol",
         "libredditNormalRedirectsChecks",
         "libredditNormalCustomRedirects",
         "libredditTorRedirectsChecks",
@@ -71,7 +73,7 @@ function init() {
         disableReddit = r.disableReddit;
         redditFrontend = r.redditFrontend;
         redditRedirects = r.redditRedirects;
-        redditProtocol = r.redditProtocol;
+        protocol = r.protocol;
         libredditNormalRedirectsChecks = r.libredditNormalRedirectsChecks;
         libredditNormalCustomRedirects = r.libredditNormalCustomRedirects;
         libredditTorRedirectsChecks = r.libredditTorRedirectsChecks;
@@ -102,8 +104,8 @@ function initLibredditCookies(test, from) {
 
     if (!test) {
       let checkedInstances;
-      if (redditProtocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
-      else if (redditProtocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
+      if (protocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
+      else if (protocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
       await utils.copyCookie('libreddit', from, checkedInstances, "theme");
       await utils.copyCookie('libreddit', from, checkedInstances, "front_page");
       await utils.copyCookie('libreddit', from, checkedInstances, "layout");
@@ -124,10 +126,10 @@ function initLibredditCookies(test, from) {
 function pasteLibredditCookies() {
   return new Promise(async resolve => {
     await init();
-    if (disableReddit || redditFrontend != 'libreddit' || redditProtocol === undefined) { resolve(); return; }
+    if (disableReddit || redditFrontend != 'libreddit' || protocol === undefined) { resolve(); return; }
     let checkedInstances;
-    if (redditProtocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
-    else if (redditProtocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
+    if (protocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
+    else if (protocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
     utils.getCookiesFromStorage('libreddit', checkedInstances, "theme");
     utils.getCookiesFromStorage('libreddit', checkedInstances, "front_page");
     utils.getCookiesFromStorage('libreddit', checkedInstances, "layout");
@@ -157,8 +159,8 @@ function initTedditCookies(test, from) {
 
     if (!test) {
       let checkedInstances;
-      if (redditProtocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
-      else if (redditProtocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
+      if (protocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
+      else if (protocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
       await utils.copyCookie('teddit', from, checkedInstances, 'collapse_child_comments')
       await utils.copyCookie('teddit', from, checkedInstances, 'domain_instagram')
       await utils.copyCookie('teddit', from, checkedInstances, 'domain_twitter')
@@ -179,10 +181,10 @@ function initTedditCookies(test, from) {
 function pasteTedditCookies() {
   return new Promise(async resolve => {
     await init();
-    if (disableReddit || redditFrontend != 'teddit' || redditProtocol === undefined) { resolve(); return; }
+    if (disableReddit || redditFrontend != 'teddit' || protocol === undefined) { resolve(); return; }
     let checkedInstances;
-    if (redditProtocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
-    else if (redditProtocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
+    if (protocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
+    else if (protocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
     utils.getCookiesFromStorage('teddit', checkedInstances, 'collapse_child_comments')
     utils.getCookiesFromStorage('teddit', checkedInstances, 'domain_instagram')
     utils.getCookiesFromStorage('teddit', checkedInstances, 'domain_twitter')
@@ -230,15 +232,17 @@ function redirect(url, type, initiator, disableOverride) {
   const bypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/;
   if (url.pathname.match(bypassPaths)) return;
 
-  let libredditInstancesList;
-  let tedditInstancesList;
-  if (redditProtocol == 'normal') {
-    libredditInstancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
-    tedditInstancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects];
-  } else if (redditProtocol == 'tor') {
-    libredditInstancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
-    tedditInstancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects];
-  }
+  let libredditInstancesList = [];
+  let tedditInstancesList = [];
+
+    if (protocol == 'tor') {
+      libredditInstancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
+      tedditInstancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects];
+    }
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      libredditInstancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
+      tedditInstancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects];
+    }
 
   if (url.host === "i.redd.it") {
     if (redditFrontend == 'teddit') {
@@ -293,18 +297,22 @@ function switchInstance(url, disableOverride) {
     if (disableReddit && !disableOverride) { resolve(); return; }
     const protocolHost = utils.protocolHost(url);
     if (!all().includes(protocolHost)) { resolve(); return; }
-    let instancesList;
+    let instancesList = [];
     if (redditFrontend == 'libreddit') {
-      if (redditProtocol == 'normal') instancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
-      else if (redditProtocol == 'tor') instancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
+      if (protocol == 'tor') instancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
+      if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
+      }
       if ([
         ...redditRedirects.teddit.normal,
         ...redditRedirects.teddit.tor
       ].includes(protocolHost)) url.pathname = url.pathname.replace("/pics/w:null_", "/img/");
     }
     else if (redditFrontend == 'teddit') {
-      if (redditProtocol == 'normal') instancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects];
-      else if (redditProtocol == 'tor') instancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects];
+      if (protocol == 'tor') instancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects];
+      if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects];
+      }
       if ([
         ...redditRedirects.libreddit.normal,
         ...redditRedirects.libreddit.tor
@@ -325,8 +333,9 @@ function initDefaults() {
   return new Promise(resolve => {
     fetch('/instances/data.json').then(response => response.text()).then(async data => {
       let dataJson = JSON.parse(data);
-      redirects.teddit = dataJson.teddit;
-      redirects.libreddit = dataJson.libreddit;
+      for (let i = 0; i < frontends.length; i++) {
+        redirects[frontends[i]] = dataJson[frontends[i]]
+      }
       browser.storage.local.get('cloudflareBlackList', async r => {
         libredditNormalRedirectsChecks = [...redirects.libreddit.normal];
         tedditNormalRedirectsChecks = [...redirects.teddit.normal]
@@ -341,7 +350,6 @@ function initDefaults() {
         }
         browser.storage.local.set({
           disableReddit: false,
-          redditProtocol: 'normal',
           redditFrontend: 'libreddit',
           redditRedirects: redirects,
 
diff --git a/src/assets/javascripts/reuters.js b/src/assets/javascripts/reuters.js
index 5f215518..ee4f227c 100644
--- a/src/assets/javascripts/reuters.js
+++ b/src/assets/javascripts/reuters.js
@@ -6,18 +6,22 @@ const targets = [
     /^https?:\/{2}(www\.|)reuters\.com.*/
 ];
 
-let redirects = {
-    "neuters": {
-        "normal": [
-            'https://neuters.de',
-        ],
-        "tor": []
+let redirects = {}
+
+const frontends = new Array("neuters")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
     }
 }
 
 let
     disableReuters,
-    reutersProtocol,
+    protocol,
+    protocolFallback,
     reutersRedirects,
     neutersNormalRedirectsChecks,
     neutersNormalCustomRedirects,
@@ -29,7 +33,8 @@ function init() {
         browser.storage.local.get(
             [
                 "disableReuters",
-                "reutersProtocol",
+                "protocol",
+                "protocolFallback",
                 "reutersRedirects",
                 "neutersNormalRedirectsChecks",
                 "neutersNormalCustomRedirects",
@@ -38,7 +43,8 @@ function init() {
             ],
             r => {
                 disableReuters = r.disableReuters;
-                reutersProtocol = r.reutersProtocol;
+                protocol = r.protocol;
+                protocolFallback = r.protocolFallback;
                 reutersRedirects = r.reutersRedirects;
                 neutersNormalRedirectsChecks = r.neutersNormalRedirectsChecks;
                 neutersNormalCustomRedirects = r.neutersNormalCustomRedirects;
@@ -63,9 +69,11 @@ function redirect(url, type, initiator, disableOverride) {
     if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return;
     if (!targets.some(rx => rx.test(url.href))) return;
 
-    let instancesList;
-    if (reutersProtocol == 'normal') instancesList = [...neutersNormalRedirectsChecks, ...neutersNormalCustomRedirects];
-    if (reutersProtocol == 'tor') instancesList = [...neutersTorRedirectsChecks, ...neutersTorCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...neutersTorRedirectsChecks, ...neutersTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...neutersNormalRedirectsChecks, ...neutersNormalCustomRedirects];
+    }
     if (instancesList.length === 0) return;
 
     const randomInstance = utils.getRandomInstance(instancesList);
@@ -87,7 +95,6 @@ function initDefaults() {
     return new Promise(resolve => {
         browser.storage.local.set({
             disableReuters: true,
-            reutersProtocol: "normal",
 
             reutersRedirects: redirects,
 
diff --git a/src/assets/javascripts/search.js b/src/assets/javascripts/search.js
index c19f4d4a..6653d2bd 100644
--- a/src/assets/javascripts/search.js
+++ b/src/assets/javascripts/search.js
@@ -7,7 +7,7 @@ const targets = [
 ];
 // Ill optimise all of assets/javascripts at a later date. For now, I'll just add librex and optimse options javascript
 const frontends = new Array("searx", "searxng", "whoogle", "librex")
-const protocols = new Array("normal", "tor", "i2p")
+const protocols = new Array("normal", "tor", "i2p", "loki")
 
 const redirects = {}
   /*
@@ -82,7 +82,8 @@ let
   disableSearch,
   searchFrontend,
   searchRedirects,
-  searchProtocol,
+  protocol,
+  protocolFallback,
   whoogleNormalRedirectsChecks,
   whoogleNormalCustomRedirects,
   whoogleTorRedirectsChecks,
@@ -115,7 +116,8 @@ function init() {
         "disableSearch",
         "searchFrontend",
         "searchRedirects",
-        "searchProtocol",
+        "protocol",
+        "protocolFallback",
         "whoogleNormalRedirectsChecks",
         "whoogleNormalCustomRedirects",
         "whoogleTorRedirectsChecks",
@@ -145,7 +147,8 @@ function init() {
         disableSearch = r.disableSearch;
         searchFrontend = r.searchFrontend;
         searchRedirects = r.searchRedirects;
-        searchProtocol = r.searchProtocol;
+        protocol = r.protocol;
+        protocolFallback = r.protocolFallback;
         whoogleNormalRedirectsChecks = r.whoogleNormalRedirectsChecks;
         whoogleNormalCustomRedirects = r.whoogleNormalCustomRedirects;
         whoogleTorRedirectsChecks = r.whoogleTorRedirectsChecks;
@@ -193,10 +196,12 @@ function initSearxCookies(test, from) {
     ].includes(protocolHost)) { resolve(); return; }
 
     if (!test) {
-      let checkedInstances;
-      if (searchProtocol == 'normal') checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
-      else if (searchProtocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
-      else if (searchProtocol == 'i2p') checkedInstances = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects];
+      let checkedInstances = [];
+      if (protocol == 'i2p') checkedInstances = [...searxI2pCustomRedirects, ...searxI2pRedirectsChecks];
+      if (protocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
+      if ((checkedInstances.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
+      }
       await utils.copyCookie('searx', from, checkedInstances, 'advanced_search');
       await utils.copyCookie('searx', from, checkedInstances, 'autocomplete');
       await utils.copyCookie('searx', from, checkedInstances, 'categories');
@@ -223,10 +228,12 @@ function pasteSearxCookies() {
   return new Promise(async resolve => {
     await init();
     if (disableSearch || searchFrontend != 'searx') { resolve(); return; }
-    let checkedInstances;
-    if (searchProtocol == 'normal') checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
-    else if (searchProtocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
-    else if (searchProtocol == 'i2p') checkedInstances = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects];
+    let checkedInstances = [];
+    if (protocol == 'i2p') checkedInstances = [...searxI2pCustomRedirects, ...searxI2pRedirectsChecks];
+    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');
@@ -262,10 +269,12 @@ function initSearxngCookies(test, from) {
     ].includes(protocolHost)) { resolve(); return; }
 
     if (!test) {
-      let checkedInstances;
-      if (searchProtocol == 'normal') checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
-      else if (searchProtocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
-      else if (searchProtocol == 'i2p') checkedInstances = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects];
+      let checkedInstances = [];
+      if (protocol == 'i2p') checkedInstances = [...searxngI2pCustomRedirects, ...searxngI2pRedirectsChecks];
+      if (protocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
+      if ((checkedInstances.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
+      }
       await utils.copyCookie('searxng', from, checkedInstances, 'autocomplete');
       await utils.copyCookie('searxng', from, checkedInstances, 'categories');
       await utils.copyCookie('searxng', from, checkedInstances, 'disabled_engines');
@@ -293,11 +302,13 @@ function initSearxngCookies(test, from) {
 function pasteSearxngCookies() {
   return new Promise(async resolve => {
     await init();
-    if (disableSearch || searchFrontend != 'searxng', searchProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (searchProtocol == 'normal') checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
-    else if (searchProtocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
-    else if (searchProtocol == 'i2p') checkedInstances = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects];
+    if (disableSearch || searchFrontend != 'searxng', protocol === undefined) { resolve(); return; }
+    let checkedInstances = [];
+    if (protocol == 'i2p') checkedInstances = [...searxngI2pCustomRedirects, ...searxngI2pRedirectsChecks];
+    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');
@@ -335,10 +346,12 @@ function initLibrexCookies(test, from) {
     ].includes(protocolHost)) { resolve(); return; }
 
     if(!test) {
-      let checkedInstances;
-      if (searchProtocol == 'normal') checkedInstances = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects];
-      else if (searchProtocol == 'tor') checkedInstances = [...librexTorRedirectsChecks, ...librexTorCustomRedirects];
-      else if (searchProtocol == 'i2p') checkedInstances = [...librexI2pRedirectsChecks, ...librexI2pCustomRedirects];
+      let checkedInstances = [];
+      if (protocol == 'i2p') checkedInstances = [...librexI2pCustomRedirects, ...librexI2pRedirectsChecks];
+      if (protocol == 'tor') checkedInstances = [...librexTorRedirectsChecks, ...librexTorCustomRedirects];
+      if ((checkedInstances.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects];
+      }
       await utils.copyCookie('librex', from, checkedInstances, 'bibliogram');
       await utils.copyCookie('librex', from, checkedInstances, 'disable_special');
       await utils.copyCookie('librex', from, checkedInstances, 'invidious');
@@ -355,11 +368,13 @@ function initLibrexCookies(test, from) {
 function pasteLibrexCookies() {
   return new Promise(async resolve => {
     await init();
-    if (disableSearch || searchFrontend != 'librex', searchProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (searchProtocol == 'normal') checkedInstances = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects];
-    else if (searchProtocol == 'tor') checkedInstances = [...librexTorRedirectsChecks, ...librexTorCustomRedirects];
-    else if (searchProtocol == 'i2p') checkedInstances = [...librexI2pRedirectsChecks, ...librexI2pCustomRedirects];
+    if (disableSearch || searchFrontend != 'librex', protocol === undefined) { resolve(); return; }
+    let checkedInstances = [];
+    if (protocol == 'i2p') checkedInstances = [...librexI2pCustomRedirects, ...librexI2pRedirectsChecks];
+    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');
@@ -380,37 +395,50 @@ function redirect(url, disableOverride) {
   let randomInstance;
   let path;
   if (searchFrontend == 'searx') {
-    let instancesList;
-    if (searchProtocol == 'normal') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
-    else if (searchProtocol == 'tor') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
-    else if (searchProtocol == 'i2p') instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects];
-    if (instancesList.length === 0) return;
+    let instancesList = [];
+    if (protocol == 'i2p') instancesList = [...searxI2pCustomRedirects, ...searxI2pRedirectsChecks];
+    if (protocol == 'tor') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
+    }
+    if (instancesList.length === 0) { return; }
+
     randomInstance = utils.getRandomInstance(instancesList)
     path = "/";
   }
   else if (searchFrontend == 'searxng') {
-    let instancesList;
-    if (searchProtocol == 'normal') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
-    else if (searchProtocol == 'tor') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
-    else if (searchProtocol == 'i2p') instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects];
-    if (instancesList.length === 0) return;
+    let instancesList = [];
+    if (protocol == 'i2p') instancesList = [...searxngI2pCustomRedirects, ...searxngI2pRedirectsChecks];
+    if (protocol == 'tor') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
+    }
+    if (instancesList.length === 0) { return; }
+
     randomInstance = utils.getRandomInstance(instancesList)
     path = "/";
   }
   else if (searchFrontend == 'whoogle') {
-    let instancesList;
-    if (searchProtocol == 'normal') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects];
-    if (searchProtocol == 'tor') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects];
-    if (searchProtocol == 'i2p') instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects];
-    if (instancesList.length === 0) return;
+    let instancesList = [];
+    if (protocol == 'i2p') instancesList = [...whoogleI2pCustomRedirects, ...whoogleI2pRedirectsChecks];
+    if (protocol == 'tor') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects];
+    }
+    if (instancesList.length === 0) { return; }
+
     randomInstance = utils.getRandomInstance(instancesList)
     path = "/search";
   }
   else if (searchFrontend == 'librex') {
-    let instancesList;
-    if (searchProtocol == 'normal') instancesList = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects];
-    if (searchProtocol == 'tor') instancesList = [...librexTorRedirectsChecks, ...librexTorCustomRedirects];
-    if (searchProtocol == 'i2p') instancesList = [...librexI2pRedirectsChecks, ...librexI2pCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'i2p') instancesList = [...librexI2pCustomRedirects, ...librexI2pRedirectsChecks];
+    if (protocol == 'tor') instancesList = [...librexTorRedirectsChecks, ...librexTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects];
+    }
+    if (instancesList.length === 0) { return; }
+
     randomInstance = utils.getRandomInstance(instancesList)
     path = "/search.php";
   }
@@ -474,25 +502,25 @@ function switchInstance(url, disableOverride) {
     ].includes(protocolHost)) { resolve(); return; }
 
     let instancesList;
-    if (searchProtocol == 'normal') {
-      if (searchFrontend == 'searx') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
-      else if (searchFrontend == 'searxng') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
-      else if (searchFrontend == 'whoogle') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects];
-      else if (searchFrontend == 'librex') instancesList = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects];
-    }
-    else if (searchProtocol == 'tor') {
+    
+    if (protocol == 'tor') {
       if (searchFrontend == 'searx') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
       else if (searchFrontend == 'searxng') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
       else if (searchFrontend == 'whoogle') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects];
       else if (searchFrontend == 'librex') instancesList = [...librexTorRedirectsChecks, ...librexTorCustomRedirects];
     }
-    else if (searchProtocol == 'i2p') {
+    else if (protocol == 'i2p') {
       if (searchFrontend == 'searx') instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects];
       else if (searchFrontend == 'searxng') instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects];
       else if (searchFrontend == 'whoogle') instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects];
       else if (searchFrontend == 'librex') instancesList = [...librexI2pRedirectsChecks, ...librexI2pCustomRedirects];
     }
-
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      if (searchFrontend == 'searx') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
+      else if (searchFrontend == 'searxng') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
+      else if (searchFrontend == 'whoogle') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects];
+      else if (searchFrontend == 'librex') instancesList = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects];
+    }
     const i = instancesList.indexOf(protocolHost);
     if (i > -1) instancesList.splice(i, 1);
     if (instancesList.length === 0) { resolve(); return; }
@@ -540,7 +568,6 @@ function initDefaults() {
           searchFrontend: 'searxng',
           searchRedirects: redirects,
           searxngCustomSettings: false,
-          searchProtocol: 'normal',
 
           whoogleNormalRedirectsChecks: whoogleNormalRedirectsChecks,
           whoogleNormalCustomRedirects: [],
diff --git a/src/assets/javascripts/sendTargets.js b/src/assets/javascripts/sendTargets.js
index f507e552..cc5b348c 100644
--- a/src/assets/javascripts/sendTargets.js
+++ b/src/assets/javascripts/sendTargets.js
@@ -8,12 +8,18 @@ const targets = [
     /^https?:\/{2}sendfiles\.online\/$/
 ];
 
-let redirects = {
-    "send": {
-        "normal": [],
-        "tor": []
+const frontends = new Array("send")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {}
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
     }
 }
+
 function setRedirects(val) {
     browser.storage.local.get('cloudflareBlackList', r => {
         redirects.send = val;
@@ -36,7 +42,8 @@ let
     sendNormalCustomRedirects,
     sendTorRedirectsChecks,
     sendTorCustomRedirects,
-    sendTargetsProtocol;
+    protocol,
+    protocolFallback;
 
 function init() {
     return new Promise(resolve => {
@@ -44,7 +51,8 @@ function init() {
             [
                 "disableSendTarget",
                 "sendTargetsRedirects",
-                "sendTargetsProtocol",
+                "protocol",
+                "protocolFallback",
                 "sendNormalRedirectsChecks",
                 "sendNormalCustomRedirects",
                 "sendTorRedirectsChecks",
@@ -57,7 +65,8 @@ function init() {
                 sendNormalCustomRedirects = r.sendNormalCustomRedirects;
                 sendTorRedirectsChecks = r.sendTorRedirectsChecks;
                 sendTorCustomRedirects = r.sendTorCustomRedirects;
-                sendTargetsProtocol = r.sendTargetsProtocol;
+                protocol = r.protocol;
+                protocolFallback = r.protocolFallback;
                 resolve();
             }
         )
@@ -85,9 +94,11 @@ function switchInstance(url, disableOverride) {
         if (!all().includes(protocolHost)) { resolve(); return; }
         if (url.pathname != '/') { resolve(); return; }
 
-        let instancesList;
-        if (sendTargetsProtocol == 'normal') instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects];
-        else if (sendTargetsProtocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects];
+        let instancesList = [];
+        if (protocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects];
+        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+            instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects];
+        }
 
         const i = instancesList.indexOf(protocolHost);
         if (i > -1) instancesList.splice(i, 1);
@@ -104,9 +115,11 @@ function redirect(url, type, initiator, disableOverride) {
     if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return;
     if (!targets.some(rx => rx.test(url.href))) return;
 
-    let instancesList;
-    if (sendTargetsProtocol == 'normal') instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects];
-    if (sendTargetsProtocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects];
+    }
     if (instancesList.length === 0) return;
 
     const randomInstance = utils.getRandomInstance(instancesList);
@@ -117,7 +130,9 @@ function initDefaults() {
     return new Promise(resolve => {
         fetch('/instances/data.json').then(response => response.text()).then(async data => {
             let dataJson = JSON.parse(data);
-            redirects.send = dataJson.send;
+            for (let i = 0; i < frontends.length; i++) {
+                redirects[frontends[i]] = dataJson[frontends[i]]
+            }
             browser.storage.local.get('cloudflareBlackList', async r => {
                 sendNormalRedirectsChecks = [...redirects.send.normal];
                 for (const instance of r.cloudflareBlackList) {
@@ -132,9 +147,7 @@ function initDefaults() {
                     sendNormalCustomRedirects: [],
 
                     sendTorRedirectsChecks: [...redirects.send.tor],
-                    sendTorCustomRedirects: [],
-
-                    sendTargetsProtocol: "normal",
+                    sendTorCustomRedirects: []
                 }, () => resolve())
             })
         })
diff --git a/src/assets/javascripts/tiktok.js b/src/assets/javascripts/tiktok.js
index 75e710d0..0bf6d592 100644
--- a/src/assets/javascripts/tiktok.js
+++ b/src/assets/javascripts/tiktok.js
@@ -6,12 +6,18 @@ const targets = [
     /^https?:\/{2}(www\.|)tiktok\.com.*/
 ];
 
-let redirects = {
-    "proxiTok": {
-        "normal": [],
-        "tor": []
+const frontends = new Array("proxiTok")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {}
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
     }
 }
+
 function setRedirects(val) {
     browser.storage.local.get('cloudflareBlackList', r => {
         redirects.proxiTok = val;
@@ -39,9 +45,11 @@ function initProxiTokCookies(test, from) {
         ].includes(protocolHost)) resolve();
 
         if (!test) {
-            let checkedInstances;
-            if (tiktokProtocol == 'normal') checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
-            else if (tiktokProtocol == 'tor') checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
+            let instancesList = [];
+            if (protocol == 'tor') instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects];
+            if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+                instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects];
+            }
             await utils.copyCookie('proxitok', from, checkedInstances, 'theme');
             await utils.copyCookie('proxitok', from, checkedInstances, 'api-legacy');
         }
@@ -52,10 +60,12 @@ function initProxiTokCookies(test, from) {
 function pasteProxiTokCookies() {
     return new Promise(async resolve => {
         await init();
-        if (disableTiktok || tiktokProtocol === undefined) { resolve(); return; }
-        let checkedInstances;
-        if (tiktokProtocol == 'normal') checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
-        else if (tiktokProtocol == 'tor') checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
+        if (disableTiktok || protocol === undefined) { resolve(); return; }
+        let instancesList = [];
+        if (protocol == 'tor') instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects];
+        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+            instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects];
+        }
         utils.getCookiesFromStorage('proxitok', checkedInstances, 'theme');
         utils.getCookiesFromStorage('proxitok', checkedInstances, 'api-legacy');
         resolve();
@@ -64,7 +74,8 @@ function pasteProxiTokCookies() {
 
 let
     disableTiktok,
-    tiktokProtocol,
+    protocol,
+    protocolFallback,
     tiktokRedirects,
     proxiTokNormalRedirectsChecks,
     proxiTokNormalCustomRedirects,
@@ -76,7 +87,8 @@ function init() {
         browser.storage.local.get(
             [
                 "disableTiktok",
-                "tiktokProtocol",
+                "protocol",
+                "protocolFallback",
                 "tiktokRedirects",
                 "proxiTokNormalRedirectsChecks",
                 "proxiTokNormalCustomRedirects",
@@ -85,7 +97,8 @@ function init() {
             ],
             r => {
                 disableTiktok = r.disableTiktok;
-                tiktokProtocol = r.tiktokProtocol;
+                protocol = r.protocol;
+                protocolFallback = r.protocolFallback;
                 tiktokRedirects = r.tiktokRedirects;
                 proxiTokNormalRedirectsChecks = r.proxiTokNormalRedirectsChecks;
                 proxiTokNormalCustomRedirects = r.proxiTokNormalCustomRedirects;
@@ -112,9 +125,11 @@ function redirect(url, type, initiator, disableOverride) {
     if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return;
     if (!targets.some(rx => rx.test(url.href))) return;
 
-    let instancesList;
-    if (tiktokProtocol == 'normal') instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects];
-    if (tiktokProtocol == 'tor') instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects];
+    }
     if (instancesList.length === 0) return;
 
     const randomInstance = utils.getRandomInstance(instancesList);
@@ -151,9 +166,11 @@ function switchInstance(url, disableOverride) {
         ];
         if (!all.includes(protocolHost)) { resolve(); return; }
 
-        let instancesList;
-        if (tiktokProtocol == 'normal') instancesList = [...proxiTokNormalCustomRedirects, ...proxiTokNormalRedirectsChecks];
-        else if (tiktokProtocol == 'tor') instancesList = [...proxiTokTorCustomRedirects, ...proxiTokTorRedirectsChecks];
+        let instancesList = [];
+        if (protocol == 'tor') instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects];
+        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+            instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects];
+        }
 
         const i = instancesList.indexOf(protocolHost);
         if (i > -1) instancesList.splice(i, 1);
@@ -168,10 +185,11 @@ function initDefaults() {
     return new Promise(async resolve => {
         fetch('/instances/data.json').then(response => response.text()).then(async data => {
             let dataJson = JSON.parse(data);
-            redirects.proxiTok = dataJson.proxiTok;
+            for (let i = 0; i < frontends.length; i++) {
+            redirects[frontends[i]] = dataJson[frontends[i]]
+            }
             browser.storage.local.set({
                 disableTiktok: false,
-                tiktokProtocol: "normal",
 
                 tiktokRedirects: redirects,
 
diff --git a/src/assets/javascripts/translate/translate.js b/src/assets/javascripts/translate/translate.js
index bbf08d52..ae64f127 100644
--- a/src/assets/javascripts/translate/translate.js
+++ b/src/assets/javascripts/translate/translate.js
@@ -6,30 +6,30 @@ const targets = [
   /^https?:\/{2}translate\.google(\.[a-z]{2,3}){1,2}\//,
 ];
 
-let redirects = {
-  "simplyTranslate": {
-    "normal": [],
-    "tor": [],
-    "i2p": [],
-    "loki": []
-  },
-  "lingva": {
-    "normal": [],
-    "tor": []
-  }
-};
+const frontends = new Array("simplyTranslate", "lingva")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {};
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
+    }
+}
 
 let
   translateDisable,
   translateFrontend,
-  translateProtocol,
+  protocol,
+  protocolFallback,
   translateRedirects,
   simplyTranslateNormalRedirectsChecks,
   simplyTranslateNormalCustomRedirects,
   simplyTranslateTorRedirectsChecks,
   simplyTranslateTorCustomRedirects,
-  simplyTranslateI2PRedirectsChecks,
-  simplyTranslateI2PCustomRedirects,
+  simplyTranslateI2pRedirectsChecks,
+  simplyTranslateI2pCustomRedirects,
   simplyTranslateLokiRedirectsChecks,
   simplyTranslateLokiCustomReidrects,
   lingvaNormalRedirectsChecks,
@@ -43,15 +43,15 @@ function init() {
       [
         "translateDisable",
         "translateFrontend",
-        "translateProtocol",
+        "protocol",
+        "protocolFallback",
         "translateRedirects",
-
         "simplyTranslateNormalRedirectsChecks",
         "simplyTranslateNormalCustomRedirects",
         "simplyTranslateTorRedirectsChecks",
         "simplyTranslateTorCustomRedirects",
-        "simplyTranslateI2PRedirectsChecks",
-        "simplyTranslateI2PCustomRedirects",
+        "simplyTranslateI2pRedirectsChecks",
+        "simplyTranslateI2pCustomRedirects",
         "simplyTranslateLokiRedirectsChecks",
         "simplyTranslateLokiCustomReidrects",
 
@@ -63,14 +63,15 @@ function init() {
       r => {
         translateDisable = r.translateDisable;
         translateFrontend = r.translateFrontend;
-        translateProtocol = r.translateProtocol;
+        protocol = r.protocol;
+        protocolFallback = r.protocolFallback
         translateRedirects = r.translateRedirects;
         simplyTranslateNormalRedirectsChecks = r.simplyTranslateNormalRedirectsChecks;
         simplyTranslateNormalCustomRedirects = r.simplyTranslateNormalCustomRedirects;
         simplyTranslateTorRedirectsChecks = r.simplyTranslateTorRedirectsChecks;
         simplyTranslateTorCustomRedirects = r.simplyTranslateTorCustomRedirects;
-        simplyTranslateI2PRedirectsChecks = r.simplyTranslateI2PRedirectsChecks;
-        simplyTranslateI2PCustomRedirects = r.simplyTranslateI2PCustomRedirects;
+        simplyTranslateI2pRedirectsChecks = r.simplyTranslateI2pRedirectsChecks;
+        simplyTranslateI2pCustomRedirects = r.simplyTranslateI2pCustomRedirects;
         simplyTranslateLokiRedirectsChecks = r.simplyTranslateLokiRedirectsChecks;
         simplyTranslateLokiCustomReidrects = r.simplyTranslateLokiCustomReidrects;
         lingvaNormalRedirectsChecks = r.lingvaNormalRedirectsChecks;
@@ -98,7 +99,7 @@ function setRedirects(val) {
       translateRedirects: redirects,
       simplyTranslateNormalRedirectsChecks: redirects.simplyTranslate.normal,
       simplyTranslateTorRedirectsChecks: redirects.simplyTranslate.tor,
-      simplyTranslateI2PRedirectsChecks: redirects.simplyTranslate.i2p,
+      simplyTranslateI2pRedirectsChecks: redirects.simplyTranslate.i2p,
       simplyTranslateLokiRedirectsChecks: redirects.simplyTranslate.loki,
       lingvaNormalRedirectsChecks,
       lingvaTorRedirectsChecks: redirects.lingva.tor,
@@ -124,9 +125,11 @@ function copyPasteLingvaLocalStorage(test, url, tabId) {
         { file: "/assets/javascripts/translate/get_lingva_preferences.js", runAt: "document_start" }
       );
 
-      let checkedInstances;
-      if (translateProtocol == 'normal') checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
-      if (translateProtocol == 'tor') checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
+      let checkedInstances = [];
+      if (protocol == 'tor') checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
+      if ((checkedInstances.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
+      }
       const i = checkedInstances.indexOf(protocolHost);
       if (i !== -1) checkedInstances.splice(i, 1);
       if (checkedInstances.length === 0) { resolve(); return; }
@@ -145,9 +148,11 @@ function pasteLingvaLocalStorage() {
   return new Promise(async resolve => {
     await init();
     if (translateDisable || translateFrontend != 'lingva') { resolve(); return; }
-    let checkedInstances;
-    if (translateProtocol == 'normal') checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
-    if (translateProtocol == 'tor') checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
+    let checkedInstances = [];
+    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" }))
@@ -164,17 +169,19 @@ function copyPasteSimplyTranslateCookies(test, from) {
       ...simplyTranslateNormalCustomRedirects,
       ...simplyTranslateTorRedirectsChecks,
       ...simplyTranslateTorCustomRedirects,
-      ...simplyTranslateI2PRedirectsChecks,
-      ...simplyTranslateI2PCustomRedirects,
+      ...simplyTranslateI2pRedirectsChecks,
+      ...simplyTranslateI2pCustomRedirects,
       ...simplyTranslateLokiRedirectsChecks,
       ...simplyTranslateLokiCustomReidrects,
     ].includes(protocolHost)) { resolve(); return; }
     if (!test) {
-      let checkedInstances;
-      if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
-      else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
-      else if (translateProtocol == 'i2p') checkedInstances = [...simplyTranslateI2PRedirectsChecks, ...simplyTranslateI2PCustomRedirects]
-      else if (translateProtocol == 'loki') checkedInstances = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomReidrects]
+      let checkedInstances = [];
+      if (protocol == 'loki') checkedInstances = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomReidrects]
+      else if (protocol == 'i2p') checkedInstances = [...simplyTranslateI2pCustomRedirects, ...simplyTranslateI2pRedirectsChecks];
+      else if (protocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects];
+      if ((checkedInstances.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
+      }
       await utils.copyCookie('simplyTranslate', from, checkedInstances, 'from_lang');
       await utils.copyCookie('simplyTranslate', from, checkedInstances, 'to_lang');
       await utils.copyCookie('simplyTranslate', from, checkedInstances, 'tts_enabled');
@@ -189,11 +196,13 @@ function pasteSimplyTranslateCookies() {
   return new Promise(async resolve => {
     await init();
     if (translateDisable || translateFrontend != 'simplyTranslate') { resolve(); return; }
-    let checkedInstances;
-    if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
-    else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
-    else if (translateProtocol == 'i2p') checkedInstances = [...simplyTranslateI2PRedirectsChecks, ...simplyTranslateI2PCustomRedirects]
-    else if (translateProtocol == 'loki') checkedInstances = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomReidrects]
+    let checkedInstances = [];
+    if (protocol == 'loki') checkedInstances = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomReidrects]
+    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');
@@ -208,11 +217,13 @@ function redirect(url, disableOverride) {
   if (!targets.some(rx => rx.test(url.href))) return;
 
   if (translateFrontend == 'simplyTranslate') {
-    let instancesList;
-    if (translateProtocol == 'normal') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
-    if (translateProtocol == 'tor') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects];
-    if (translateProtocol == 'i2p') instancesList = [...simplyTranslateI2PRedirectsChecks, ...simplyTranslateI2PCustomRedirects];
-    if (translateProtocol == 'loki') instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomReidrects];
+    let instancesList = [];
+    if (protocol == 'loki') instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomReidrects];
+    else if (protocol == 'i2p') instancesList = [...simplyTranslateI2pRedirectsChecks, ...simplyTranslateI2pCustomRedirects];
+    else if (protocol == 'tor') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
+    }
     if (instancesList.length === 0) return;
 
     const randomInstance = utils.getRandomInstance(instancesList)
@@ -226,9 +237,11 @@ function redirect(url, disableOverride) {
       let pair = params_arr[i].split('=');
       params[pair[0]] = pair[1];
     }
-    let instancesList;
-    if (translateProtocol == 'normal') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
-    if (translateProtocol == 'tor') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
+    }
     if (instancesList.length === 0) return;
 
     const randomInstance = utils.getRandomInstance(instancesList)
@@ -252,7 +265,7 @@ function switchInstance(url, disableOverride) {
 
       ...simplyTranslateNormalCustomRedirects,
       ...simplyTranslateTorCustomRedirects,
-      ...simplyTranslateI2PCustomRedirects,
+      ...simplyTranslateI2pCustomRedirects,
       ...simplyTranslateLokiCustomReidrects,
 
       ...translateRedirects.lingva.normal,
@@ -263,21 +276,22 @@ function switchInstance(url, disableOverride) {
     ].includes(protocolHost)) { resolve(); return; }
 
     let instancesList;
-    if (translateProtocol == 'normal') {
-      if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
-      else if (translateFrontend == 'lingva') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
+
+    if (protocol == 'loki') {
+      if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomReidrects];
+      //else if (translateFrontend == 'lingva') instancesList = [...lingvaLokiRedirectsChecks, ...lingvaLokiCustomRedirects];
+    }
+    else if (protocol == 'i2p') {
+       if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateI2pRedirectsChecks, ...simplyTranslateI2pCustomRedirects];
+       //else if (translateFrontend == 'lingva') instancesList = [...lingvaI2PRedirectsChecks, ...lingvaI2PCustomRedirects];   
     }
-    else if (translateProtocol == 'tor') {
+    else if (protocol == 'tor') {
       if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects];
       else if (translateFrontend == 'lingva') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
     }
-    else if (translateProtocol == 'i2p') {
-       if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateI2PRedirectsChecks, ...simplyTranslateI2PCustomRedirects];
-       //else if (translateFrontend == 'lingva') instancesList = [...lingvaI2PRedirectsChecks, ...lingvaI2PCustomRedirects];   
-    }
-    else if (translateProtocol == 'loki') {
-      if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomReidrects];
-      //else if (translateFrontend == 'lingva') instancesList = [...lingvaLokiRedirectsChecks, ...lingvaLokiCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
+      else if (translateFrontend == 'lingva') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
     }
 
     const i = instancesList.indexOf(protocolHost);
@@ -293,8 +307,9 @@ function initDefaults() {
   return new Promise(async resolve => {
     fetch('/instances/data.json').then(response => response.text()).then(data => {
       let dataJson = JSON.parse(data);
-      redirects.simplyTranslate = dataJson.simplyTranslate;
-      redirects.lingva = dataJson.lingva;
+      for (let i = 0; i < frontends.length; i++) {
+        redirects[frontends[i]] = dataJson[frontends[i]]
+      }
       browser.storage.local.get('cloudflareBlackList',
         async r => {
           lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
@@ -305,15 +320,14 @@ function initDefaults() {
           browser.storage.local.set({
             translateDisable: false,
             translateFrontend: "simplyTranslate",
-            translateProtocol: 'normal',
             translateRedirects: redirects,
 
             simplyTranslateNormalRedirectsChecks: [...redirects.simplyTranslate.normal],
             simplyTranslateNormalCustomRedirects: [],
             simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
             simplyTranslateTorCustomRedirects: [],
-            simplyTranslateI2PRedirectsChecks: [...redirects.simplyTranslate.i2p],
-            simplyTranslateI2PCustomRedirects: [],
+            simplyTranslateI2pRedirectsChecks: [...redirects.simplyTranslate.i2p],
+            simplyTranslateI2pCustomRedirects: [],
             simplyTranslateLokiRedirectsChecks: [...redirects.simplyTranslate.loki],
             simplyTranslateLokiCustomReidrects: [],
 
diff --git a/src/assets/javascripts/twitter.js b/src/assets/javascripts/twitter.js
index bd674aba..e69d9abc 100644
--- a/src/assets/javascripts/twitter.js
+++ b/src/assets/javascripts/twitter.js
@@ -9,12 +9,17 @@ const targets = [
   /^https?:\/{2}t\.co/
 ];
 
-let redirects = {
-  "nitter": {
-    "normal": [],
-    "tor": []
-  },
-};
+const frontends = new Array("nitter")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {}
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
+    }
+}
 
 function setRedirects(val) {
   browser.storage.local.get(['cloudflareBlackList', 'authenticateBlackList'], r => {
@@ -34,7 +39,8 @@ function setRedirects(val) {
 
 let
   disableTwitter,
-  twitterProtocol,
+  protocol,
+  protocolFallback,
   twitterRedirects,
   twitterRedirectType,
   nitterNormalRedirectsChecks,
@@ -47,7 +53,8 @@ function init() {
     browser.storage.local.get(
       [
         "disableTwitter",
-        "twitterProtocol",
+        "protocol",
+        "protocolFallback",
         "twitterRedirects",
         "twitterRedirectType",
         "nitterNormalRedirectsChecks",
@@ -57,7 +64,8 @@ function init() {
       ],
       r => {
         disableTwitter = r.disableTwitter;
-        twitterProtocol = r.twitterProtocol;
+        protocol = r.protocol;
+        protocolFallback = r.protocolFallback;
         twitterRedirects = r.twitterRedirects;
         twitterRedirectType = r.twitterRedirectType;
         nitterNormalRedirectsChecks = r.nitterNormalRedirectsChecks;
@@ -90,9 +98,11 @@ function redirect(url, type, initiator, disableOverride) {
   if (twitterRedirectType == 'sub_frame' && type == "main_frame") return;
   if (twitterRedirectType == 'main_frame' && type != "main_frame") return;
 
-  let instancesList;
-  if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
-  else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
+  let instancesList = [];
+  if (protocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
+  if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+    instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
+  }
   if (instancesList.length === 0) return;
 
   const randomInstance = utils.getRandomInstance(instancesList);
@@ -125,9 +135,11 @@ function switchInstance(url, disableOverride) {
     if (disableTwitter && !disableOverride) { resolve(); return; }
     const protocolHost = utils.protocolHost(url);
     if (!all().includes(protocolHost)) { resolve(); return; }
-    let instancesList;
-    if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
-    else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
+    }
 
     let index = instancesList.indexOf(protocolHost);
     if (index > -1) instancesList.splice(index, 1);
@@ -164,9 +176,11 @@ function initNitterCookies(test, from) {
     if (!all().includes(protocolHost)
     ) { resolve(); return; }
     if (!test) {
-      let checkedInstances;
-      if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
-      else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
+      let checkedInstances = [];
+      if (protocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
+      if ((checkedInstances.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
+      }
       await utils.copyCookie('nitter', from, checkedInstances, 'theme');
       await utils.copyCookie('nitter', from, checkedInstances, 'infiniteScroll');
       await utils.copyCookie('nitter', from, checkedInstances, 'stickyProfile');
@@ -194,10 +208,12 @@ function initNitterCookies(test, from) {
 function pasteNitterCookies() {
   return new Promise(async resolve => {
     await init();
-    if (disableTwitter || twitterProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
-    else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
+    if (disableTwitter || protocol === undefined) { resolve(); return; }
+    let checkedInstances = [];
+    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');
@@ -226,7 +242,9 @@ function initDefaults() {
   return new Promise(resolve => {
     fetch('/instances/data.json').then(response => response.text()).then(data => {
       let dataJson = JSON.parse(data);
-      redirects.nitter = dataJson.nitter;
+      for (let i = 0; i < frontends.length; i++) {
+        redirects[frontends[i]] = dataJson[frontends[i]]
+      }
       browser.storage.local.get(['cloudflareBlackList', 'authenticateBlackList'], async r => {
         nitterNormalRedirectsChecks = [...redirects.nitter.normal];
         for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList]) {
@@ -236,7 +254,6 @@ function initDefaults() {
         browser.storage.local.set({
           disableTwitter: false,
           twitterRedirects: redirects,
-          twitterProtocol: "normal",
           twitterRedirectType: "both",
 
           nitterNormalRedirectsChecks: nitterNormalRedirectsChecks,
diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js
index a5300364..f9d48275 100644
--- a/src/assets/javascripts/utils.js
+++ b/src/assets/javascripts/utils.js
@@ -53,6 +53,7 @@ function updateInstances() {
       libremdbHelper.setRedirects(instances.libremdb);
       sendTargetsHelper.setRedirects(instances.send);
       tiktokHelper.setRedirects(instances.proxiTok);
+      lbryHelper.setRedirects(instances.librarian);
 
       console.info("Successfully updated Instances");
       resolve(true); return;
@@ -119,13 +120,13 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
     for (const element of nameCheckListElement.getElementsByTagName('input'))
       element.checked = nameDefaultRedirects.includes(element.className)
     if (nameDefaultRedirects.length == 0) isTrue = false;
-    nameProtocolElement.getElementsByClassName('toogle-all')[0].checked = isTrue;
+    nameProtocolElement.getElementsByClassName('toggle-all')[0].checked = isTrue;
   }
   nameCheckListElement.innerHTML =
     [
       `<div>
         <x data-localise="__MSG_toggleAll__">Toggle All</x>
-        <input type="checkbox" class="toogle-all"/>
+        <input type="checkbox" class="toggle-all"/>
       </div>`,
       ...redirects[name][protocol].map(
         x => {
@@ -153,7 +154,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
   localise.localisePage();
 
   calcNameCheckBoxes();
-  nameProtocolElement.getElementsByClassName('toogle-all')[0].addEventListener("change", async event => {
+  nameProtocolElement.getElementsByClassName('toggle-all')[0].addEventListener("change", async event => {
     if (event.target.checked)
       nameDefaultRedirects = [...redirects[name][protocol]];
     else
@@ -164,7 +165,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
   });
 
   for (let element of nameCheckListElement.getElementsByTagName('input')) {
-    if (element.className != 'toogle-all')
+    if (element.className != 'toggle-all')
       nameProtocolElement.getElementsByClassName(element.className)[0].addEventListener("change", async event => {
         if (event.target.checked)
           nameDefaultRedirects.push(element.className)
diff --git a/src/assets/javascripts/wikipedia.js b/src/assets/javascripts/wikipedia.js
index 629219b8..d945e221 100644
--- a/src/assets/javascripts/wikipedia.js
+++ b/src/assets/javascripts/wikipedia.js
@@ -4,13 +4,18 @@ import utils from './utils.js'
 
 const targets = /^https?:\/{2}(([a-z]{1,}\.){0,})wikipedia\.org/
 
-let redirects = {
-  "wikiless": {
-    "normal": [],
-    "tor": [],
-    "i2p": []
-  }
-};
+const frontends = new Array("wikiless")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {};
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
+    }
+}
+
 function setRedirects(val) {
   browser.storage.local.get('cloudflareBlackList', r => {
     redirects.wikiless = val;
@@ -29,7 +34,8 @@ function setRedirects(val) {
 let
   disableWikipedia,
   wikipediaRedirects,
-  wikipediaProtocol,
+  protocol,
+  protocolFallback,
   wikilessNormalRedirectsChecks,
   wikilessTorRedirectsChecks,
   wikilessI2pRedirectsChecks,
@@ -43,8 +49,8 @@ function init() {
       [
         "disableWikipedia",
         "wikipediaRedirects",
-        "wikipediaProtocol",
-
+        "protocol",
+        "protocolFallback",
         "wikilessNormalRedirectsChecks",
         "wikilessTorRedirectsChecks",
         "wikilessI2pRedirectsChecks",
@@ -55,7 +61,8 @@ function init() {
       r => {
         disableWikipedia = r.disableWikipedia;
         wikipediaRedirects = r.wikipediaRedirects;
-        wikipediaProtocol = r.wikipediaProtocol;
+        protocol = r.protocol;
+        protocolFallback = r.protocolFallback;
         wikilessNormalRedirectsChecks = r.wikilessNormalRedirectsChecks;
         wikilessTorRedirectsChecks = r.wikilessTorRedirectsChecks;
         wikilessI2pRedirectsChecks = r.wikilessI2pRedirectsChecks;
@@ -86,10 +93,12 @@ function initWikilessCookies(test, from) {
     if (!all.includes(protocolHost)) { resolve(); return; }
 
     if (!test) {
-      let checkedInstances;
-      if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
-      else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
-      else if (wikipediaProtocol == 'i2p') checkedInstances = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects]
+      let checkedInstances = [];
+      if (protocol == 'i2p') checkedInstances = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks];
+      if (protocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects];
+      if ((checkedInstances.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects];
+      }
       await utils.copyCookie('wikiless', from, checkedInstances, 'theme');
       await utils.copyCookie('wikiless', from, checkedInstances, 'default_lang');
     }
@@ -100,10 +109,13 @@ function initWikilessCookies(test, from) {
 function pasteWikilessCookies() {
   return new Promise(async resolve => {
     await init();
-    if (disableWikipedia || wikipediaProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
-    else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
+    if (disableWikipedia || protocol === undefined) { resolve(); return; }
+    let checkedInstances = [];
+    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();
@@ -123,10 +135,12 @@ function redirect(url, disableOverride) {
       GETArguments.push([args[0], args[1]]);
     }
   }
-  let instancesList;
-  if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects];
-  else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects];
-  else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects];
+  let instancesList = [];
+  if (protocol == 'i2p') instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks];
+  else if (protocol == 'tor') instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects];
+  if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+    instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects];
+  }
   if (instancesList.length === 0) return;
   const randomInstance = utils.getRandomInstance(instancesList)
 
@@ -162,10 +176,12 @@ function switchInstance(url, disableOverride) {
     ];
     if (!wikipediaList.includes(protocolHost)) { resolve(); return; }
 
-    let instancesList;
-    if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalCustomRedirects, ...wikilessNormalRedirectsChecks];
-    else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorCustomRedirects, ...wikilessTorRedirectsChecks];
-    else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks];
+    let instancesList = [];
+    if (protocol == 'i2p') instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks];
+    else if (protocol == 'tor') instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects];
+    }
 
     let index = instancesList.indexOf(protocolHost);
     if (index > -1) instancesList.splice(index, 1);
@@ -180,7 +196,9 @@ function initDefaults() {
   return new Promise(resolve => {
     fetch('/instances/data.json').then(response => response.text()).then(async data => {
       let dataJson = JSON.parse(data);
-      redirects.wikiless = dataJson.wikiless;
+      for (let i = 0; i < frontends.length; i++) {
+        redirects[frontends[i]] = dataJson[frontends[i]]
+      }
       browser.storage.local.get('cloudflareBlackList', async r => {
         wikilessNormalRedirectsChecks = [...redirects.wikiless.normal];
         for (const instance of r.cloudflareBlackList) {
@@ -190,7 +208,6 @@ function initDefaults() {
         browser.storage.local.set({
           disableWikipedia: true,
           wikipediaRedirects: redirects,
-          wikipediaProtocol: "normal",
           wikilessNormalRedirectsChecks: wikilessNormalRedirectsChecks,
           wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
           wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
diff --git a/src/assets/javascripts/youtube/youtube.js b/src/assets/javascripts/youtube/youtube.js
index 965b94bf..feb2fc12 100644
--- a/src/assets/javascripts/youtube/youtube.js
+++ b/src/assets/javascripts/youtube/youtube.js
@@ -16,23 +16,19 @@ const targets = [
 
   /^https?:\/{2}(www\.|)(youtube|youtube-nocookie)\.com\/embed\/..*/,
 ];
-let redirects = {
-  "invidious": {
-    "normal": [],
-    "tor": []
-  },
-  "piped": {
-    "normal": [],
-    "tor": []
-  },
-  "pipedMaterial": {
-    "normal": [
-      "https://piped-material.xn--17b.net",
-      "https://piped-material.ftp.sh",
-    ],
-    "tor": []
-  }
-};
+
+const frontends = new Array("invidious", "piped", "pipedMaterial")
+const protocols = new Array("normal", "tor", "i2p", "loki")
+
+let redirects = {};
+
+for (let i = 0; i < frontends.length; i++) {
+    redirects[frontends[i]] = {}
+    for (let x = 0; x < protocols.length; x++) {
+        redirects[frontends[i]][protocols[x]] = []
+    }
+}
+
 function setRedirects(val) {
   browser.storage.local.get('cloudflareBlackList', r => {
     redirects.invidious = val.invidious;
@@ -60,7 +56,8 @@ let
   disableYoutube,
   onlyEmbeddedVideo,
   youtubeFrontend,
-  youtubeProtocol,
+  protocol,
+  protocolFallback,
   youtubeEmbedFrontend,
   youtubeRedirects,
   invidiousNormalRedirectsChecks,
@@ -83,7 +80,8 @@ function init() {
         "disableYoutube",
         "onlyEmbeddedVideo",
         "youtubeFrontend",
-        "youtubeProtocol",
+        "protocol",
+        "protocolFallback",
         "youtubeEmbedFrontend",
         "youtubeRedirects",
         "invidiousNormalRedirectsChecks",
@@ -103,7 +101,8 @@ function init() {
         disableYoutube = r.disableYoutube;
         onlyEmbeddedVideo = r.onlyEmbeddedVideo;
         youtubeFrontend = r.youtubeFrontend;
-        youtubeProtocol = r.youtubeProtocol;
+        protocol = r.protocol;
+        protocolFallback = r.protocolFallback;
         youtubeEmbedFrontend = r.youtubeEmbedFrontend;
         youtubeRedirects = r.youtubeRedirects;
         invidiousNormalRedirectsChecks = r.invidiousNormalRedirectsChecks;
@@ -178,25 +177,31 @@ function redirect(url, type, initiator, disableOverride) {
   if (isFreetube && main_frame) return `freetube://https://youtube.com${url.pathname}${url.search}`;
 
   if (isInvidious || ((isFreetube || isYatte) && sub_frame && isFrontendInvidious)) {
-    let instancesList;
-    if (youtubeProtocol == 'normal') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
-    else if (youtubeProtocol == 'tor') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
+  let instancesList = [] = [];
+  if (protocol == 'tor') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
+  if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+    instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
+  }
     if (instancesList.length === 0) return;
     const randomInstance = utils.getRandomInstance(instancesList);
     return `${randomInstance}${url.pathname}${url.search}`;
   }
   if (isPiped || ((isFreetube || isYatte) && sub_frame && isFrontendPiped)) {
-    let instancesList;
-    if (youtubeProtocol == 'normal') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
-    else if (youtubeProtocol == 'tor') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
+    }
     if (instancesList.length === 0) return;
     const randomInstance = utils.getRandomInstance(instancesList);
     return `${randomInstance}${url.pathname}${url.search}`;
   }
   if (isPipedMaterial || ((isFreetube || isYatte) && sub_frame && isFrontendPipedMaterial)) {
-    let instancesList;
-    if (youtubeProtocol == 'normal') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
-    else if (youtubeProtocol == 'tor') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects];
+    let instancesList = [];
+    if (protocol == 'tor') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects];
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
+    }
     const randomInstance = utils.getRandomInstance(instancesList);
     return `${randomInstance}${url.pathname}${url.search}`;
   }
@@ -219,17 +224,18 @@ function switchInstance(url, disableOverride) {
     const protocolHost = utils.protocolHost(url);
     if (!all().includes(protocolHost)) { resolve(); return; }
 
-    let instancesList;
-    if (youtubeProtocol == 'normal') {
-      if (youtubeFrontend == 'invidious') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
-      else if (youtubeFrontend == 'piped') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
-      else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
-    }
-    else if (youtubeProtocol == 'tor') {
+    let instancesList = [] = [];
+
+    if (protocol == 'tor') {
       if (youtubeFrontend == 'invidious') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
       else if (youtubeFrontend == 'piped') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
       else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects];
     }
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      if (youtubeFrontend == 'invidious') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
+      else if (youtubeFrontend == 'piped') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
+      else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
+    }
 
     const i = instancesList.indexOf(protocolHost);
     if (i > -1) instancesList.splice(i, 1);
@@ -244,8 +250,9 @@ function initDefaults() {
   return new Promise(async resolve => {
     fetch('/instances/data.json').then(response => response.text()).then(async data => {
       let dataJson = JSON.parse(data);
-      redirects.invidious = dataJson.invidious;
-      redirects.piped = dataJson.piped;
+      for (let i = 0; i < frontends.length; i++) {
+        redirects[frontends[i]] = dataJson[frontends[i]]
+      }
       browser.storage.local.get('cloudflareBlackList', async r => {
 
         invidiousNormalRedirectsChecks = [...redirects.invidious.normal];
@@ -290,8 +297,7 @@ function initDefaults() {
           pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
           pipedMaterialTorCustomRedirects: [],
 
-          youtubeEmbedFrontend: 'invidious',
-          youtubeProtocol: 'normal',
+          youtubeEmbedFrontend: 'invidious'
         }, () => resolve())
       })
     })
@@ -310,9 +316,12 @@ function copyPasteInvidiousCookies(test, from) {
       ...invidiousTorCustomRedirects,
     ].includes(protocolHost)) { resolve(); return; }
     if (!test) {
-      let checkedInstances;
-      if (youtubeProtocol == 'normal') checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-      else if (youtubeProtocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
+      let checkedInstances = [];
+
+      if (protocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
+      if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
+      }
       const i = checkedInstances.indexOf(protocolHost);
       if (i !== -1) checkedInstances.splice(i, 1);
       await utils.copyCookie('invidious', from, checkedInstances, 'PREFS');
@@ -325,9 +334,11 @@ function pasteInvidiousCookies() {
   return new Promise(async resolve => {
     await init();
     if (disableYoutube || youtubeFrontend != 'invidious') { resolve(); return; }
-    let checkedInstances;
-    if (youtubeProtocol == 'normal') checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-    else if (youtubeProtocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
+    let checkedInstances = [];
+    if (protocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
+    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+      checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
+    }
     utils.getCookiesFromStorage('invidious', checkedInstances, 'PREFS');
     resolve();
   })
@@ -348,9 +359,11 @@ function copyPastePipedLocalStorage(test, url, tabId) {
     if (!test) {
       browser.tabs.executeScript(tabId, { file: "/assets/javascripts/youtube/get_piped_preferences.js", runAt: "document_start" });
 
-      let checkedInstances;
-      if (youtubeProtocol == 'normal') checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
-      else if (youtubeProtocol == 'tor') checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
+      let checkedInstances = [];
+      if (protocol == 'tor') checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
+      if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
+      }
       const i = checkedInstances.indexOf(protocolHost);
       if (i !== -1) checkedInstances.splice(i, 1);
       for (const to of checkedInstances) {
@@ -365,9 +378,11 @@ function pastePipedLocalStorage() {
   return new Promise(async resolve => {
     await init();
     if (disableYoutube || youtubeFrontend != 'piped') { resolve(); return; }
-    let checkedInstances;
-    if (youtubeProtocol == 'normal') checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
-    else if (youtubeProtocol == 'tor') checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
+    let checkedInstances = [];
+    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" }))
@@ -391,9 +406,11 @@ function copyPastePipedMaterialLocalStorage(test, url, tabId,) {
     if (!test) {
       browser.tabs.executeScript(tabId, { file: "/assets/javascripts/youtube/get_pipedMaterial_preferences.js", runAt: "document_start" });
 
-      let checkedInstances;
-      if (youtubeProtocol == 'normal') checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
-      else if (youtubeProtocol == 'tor') checkedInstances = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
+      let checkedInstances = [];
+      if (protocol == 'tor') checkedInstances = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
+      if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+        checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
+      }
       const i = checkedInstances.indexOf(protocolHost);
       if (i !== -1) checkedInstances.splice(i, 1);
       for (const to of checkedInstances)
@@ -410,9 +427,11 @@ function pastePipedMaterialLocalStorage() {
   return new Promise(async resolve => {
     await init();
     if (disableYoutube || youtubeFrontend != 'pipedMaterial') { resolve(); return; }
-    let checkedInstances;
-    if (youtubeProtocol == 'normal') checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
-    else if (youtubeProtocol == 'tor') checkedInstances = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
+    let checkedInstances = [];
+    if (protocol == 'tor') checkedInstances = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
+    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" }))
@@ -427,18 +446,16 @@ function removeXFrameOptions(e) {
   if (e.type == 'main_frame') {
     for (const i in e.responseHeaders) {
       if (e.responseHeaders[i].name == 'content-security-policy') {
-        let instancesList;
-        if (youtubeFrontend == 'invidious') {
-          if (youtubeProtocol == 'normal') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
-          else if (youtubeProtocol == 'tor') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
-        }
-        else if (youtubeFrontend == 'piped') {
-          if (youtubeProtocol == 'normal') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
-          else if (youtubeProtocol == 'tor') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
+        let instancesList = [];
+        if (protocol == 'tor') {
+          if (youtubeFrontend == 'invidious') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
+          if (youtubeFrontend == 'piped') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
+          if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects];
         }
-        else if (youtubeFrontend == 'pipedMaterial') {
-          if (youtubeProtocol == 'normal') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
-          else if (youtubeProtocol == 'tor') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects];
+        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
+          if (youtubeFrontend == 'invidious') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
+          if (youtubeFrontend == 'piped') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
+          if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
         }
         let securityPolicyList = e.responseHeaders[i].value.split(';');
         for (const i in securityPolicyList) securityPolicyList[i] = securityPolicyList[i].trim();