diff --git a/audit/run.js b/audit/run.js
index b20a4280a98084a830686c7e93dc0ce6f788ad3d..6b36dedb60bf80a11ed8ac69ed780993dc78d75b 100644
--- a/audit/run.js
+++ b/audit/run.js
@@ -15,12 +15,11 @@
  * Imports
  */
 
-var fileSystem, crypto, http, path, sourceMappingURL;
+var fileSystem, crypto, https, sourceMappingURL;
 
 fileSystem = require('fs');
 crypto = require('crypto');
 https = require('https');
-path = require('path');
 
 sourceMappingURL = require('source-map-url');
 
@@ -205,7 +204,7 @@ resourceAmount = localResourcePaths.length;
  * Script
  */
 
-localResourcePaths.forEach(function (resourcePath, index) {
+localResourcePaths.forEach(function (resourcePath) {
 
     var resourceRoute = resourcePath.substr(localResourceLocationLength + 1);
     resourceRoute = resourceRoute.substring(0, resourceRoute.length - 4);
diff --git a/core/constants.js b/core/constants.js
new file mode 100644
index 0000000000000000000000000000000000000000..e68440d5b2daf1d81329403b3c9b94e4e20486a5
--- /dev/null
+++ b/core/constants.js
@@ -0,0 +1,31 @@
+/**
+ * Global Constants
+ * Belongs to Decentraleyes.
+ *
+ * @author      Thomas Rientjes
+ * @since       2017-10-27
+ * @license     MPL 2.0
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+'use strict';
+
+/**
+ * Constants
+ */
+
+const HOST_PREFIX = '*://';
+const HOST_SUFFIX = '/*';
+const HTTP_EXPRESSION = /^http?:\/\//;
+const MAPPING_FILE_EXPRESSION = /\.map$/i;
+const REQUEST_BLOCKING = 'blocking';
+const REQUEST_HEADERS = 'requestHeaders';
+const VALUE_SEPARATOR = ';';
+const VERSION_EXPRESSION = /(?:\d{1,2}\.){1,3}\d{1,2}/;
+const VERSION_PLACEHOLDER = '{version}';
+const WEB_DOMAIN_EXPRESSION = /:\/\/(.[^/]+)(.*)/;
+const WEB_PREFIX_LENGTH = 4;
+const WEB_PREFIX_VALUE = 'www.';
diff --git a/core/interceptor.js b/core/interceptor.js
index 57ce92afef9f200343eb3595c07a34af20b3b0bc..f361425b538e15730b8629f4a2e4f5062894af2f 100644
--- a/core/interceptor.js
+++ b/core/interceptor.js
@@ -19,12 +19,6 @@
 
 var interceptor = {};
 
-/**
- * Constants
- */
-
-const HTTP_EXPRESSION = /^http?:\/\//;
-
 /**
  * Public Methods
  */
@@ -60,7 +54,7 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
         'udacity.com': true
     };
 
-    if (undetectableTaintedDomains[tabDomain] || /yandex\./.test(tabDomain)) {
+    if (undetectableTaintedDomains[tabDomain] || (/yandex\./).test(tabDomain)) {
 
         if (tabDomain !== 'yandex.ru') {
             return interceptor._handleMissingCandidate(requestDetails.url);
@@ -79,8 +73,7 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
     }
 
     stateManager.requests[requestDetails.requestId] = {
-        'tabIdentifier': tabIdentifier,
-        'targetDetails': targetDetails
+        tabIdentifier, targetDetails
     };
 
     return {
@@ -103,10 +96,10 @@ interceptor._handleMissingCandidate = function (requestUrl) {
 
     if (requestUrl.match(HTTP_EXPRESSION)) {
 
-        requestUrl = requestUrl.replace(HTTP_EXPRESSION, 'https://');
+        let secureRequestUrl = requestUrl.replace(HTTP_EXPRESSION, 'https://');
 
         return {
-            'redirectUrl': requestUrl
+            'redirectUrl': secureRequestUrl
         };
 
     } else {
diff --git a/core/main.js b/core/main.js
index 9f09d280476c99ad8c3685cc450834cdaa9c2eb2..9bfc787612e6d4f0dbbf7c04245b67514fc71d15 100644
--- a/core/main.js
+++ b/core/main.js
@@ -52,19 +52,19 @@ main._initializeOptions = function () {
 
 main._showReleaseNotes = function (details) {
 
-    let location = browser.extension.getURL('pages/welcome/welcome.html');
+    let location = chrome.extension.getURL('pages/welcome/welcome.html');
 
     if (details.reason === 'install' || details.reason === 'update') {
 
-        if (details.temporary === false) {
+        if (details.temporary !== true) {
 
-            browser.storage.local.get({
+            chrome.storage.local.get({
                 'showReleaseNotes': true
             }, function (options) {
 
                 if (options.showReleaseNotes === true) {
 
-                    browser.tabs.create({
+                    chrome.tabs.create({
                         'url': location,
                         'active': false
                     });
@@ -78,7 +78,7 @@ main._showReleaseNotes = function (details) {
  * Initializations
  */
 
-browser.runtime.onInstalled.addListener(main._showReleaseNotes);
+chrome.runtime.onInstalled.addListener(main._showReleaseNotes);
 main._initializeOptions();
 
 chrome.runtime.getPlatformInfo(function (information) {
diff --git a/core/mappings.js b/core/mappings.js
index fca471e81a6eb9b07ace346abe04be30bdb7a598..3aac79592d9571a5a0c758b83908a9d7a267c424 100644
--- a/core/mappings.js
+++ b/core/mappings.js
@@ -37,40 +37,40 @@ var mappings = {
 
             // Common Shorthand Notations [Deprecated]
             'dojo/1/dojo/dojo.': {
-                path: 'resources/dojo/1.6.1/dojo/dojo.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/dojo/1.6.1/dojo/dojo.js.dec',
+                'type': 'application/javascript'
             },
             'jquery/1/jquery.': {
-                path: 'resources/jquery/1.11.1/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.11.1/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jqueryui/1/jquery-ui.js': {
-                path: 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec',
+                'type': 'application/javascript'
             },
             'jqueryui/1/jquery-ui.min.js': {
-                path: 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec',
+                'type': 'application/javascript'
             },
             'mootools/1/mootools-yui-compressed.': {
-                path: 'resources/mootools/1.1.2/mootools-yui-compressed.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/mootools/1.1.2/mootools-yui-compressed.js.dec',
+                'type': 'application/javascript'
             },
             'prototype/1/prototype.': {
-                path: 'resources/prototype/1.7.1.0/prototype.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/prototype/1.7.1.0/prototype.js.dec',
+                'type': 'application/javascript'
             },
             'scriptaculous/1/scriptaculous.': {
-                path: 'resources/scriptaculous/1.9.0/scriptaculous.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/scriptaculous/1.9.0/scriptaculous.js.dec',
+                'type': 'application/javascript'
             },
             'swfobject/2/swfobject.': {
-                path: 'resources/swfobject/2.2/swfobject.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/swfobject/2.2/swfobject.js.dec',
+                'type': 'application/javascript'
             },
             'webfont/1/webfont.': {
-                path: 'resources/webfont/1.5.18/webfont.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/webfont/1.5.18/webfont.js.dec',
+                'type': 'application/javascript'
             }
         }
     },
@@ -118,52 +118,52 @@ var mappings = {
 
             // Common Shorthand Notations [Deprecated]
             'jquery-latest.': {
-                path: 'resources/jquery/1.11.1/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.11.1/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery.': {
-                path: 'resources/jquery/1.11.1/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.11.1/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.3.min.js': {
-                path: 'resources/jquery/1.3.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.3.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.3.js': {
-                path: 'resources/jquery/1.3.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.3.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.4.min.js': {
-                path: 'resources/jquery/1.4.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.4.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.4.js': {
-                path: 'resources/jquery/1.4.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.4.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.5.min.js': {
-                path: 'resources/jquery/1.5.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.5.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.5.js': {
-                path: 'resources/jquery/1.5.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.5.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.6.min.js': {
-                path: 'resources/jquery/1.6.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.6.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.6.js': {
-                path: 'resources/jquery/1.6.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.6.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.7.min.js': {
-                path: 'resources/jquery/1.7.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.7.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             },
             'jquery-1.7.js': {
-                path: 'resources/jquery/1.7.0/jquery.min.js.dec',
-                type: 'application/javascript'
+                'path': 'resources/jquery/1.7.0/jquery.min.js.dec',
+                'type': 'application/javascript'
             }
         }
     },
diff --git a/core/request-analyzer.js b/core/request-analyzer.js
index 513a0991c11c28c2855b470e0a3e67eaa9969714..70b41cb45764e6135076578bd92a6ad2144901c9 100644
--- a/core/request-analyzer.js
+++ b/core/request-analyzer.js
@@ -19,17 +19,6 @@
 
 var requestAnalyzer = {};
 
-/**
- * Constants
- */
-
-const MAPPING_FILE_EXPRESSION = new RegExp('\.map$', 'i');
-const VERSION_EXPRESSION = /(?:\d{1,2}\.){1,3}\d{1,2}/;
-const VERSION_PLACEHOLDER = '{version}';
-const WEB_DOMAIN_EXPRESSION = /:\/\/(.[^\/]+)(.*)/;
-const WEB_PREFIX_VALUE = 'www.';
-const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length;
-
 /**
  * Public Methods
  */
@@ -96,7 +85,7 @@ requestAnalyzer._matchBasePath = function (hostMappings, channelPath) {
 
 requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channelHost, channelPath) {
 
-    var resourcePath, versionNumber, resourcePattern;
+    let resourcePath, versionNumber, resourcePattern;
 
     resourcePath = channelPath.replace(basePath, '');
 
@@ -116,9 +105,9 @@ requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channel
 
             // Prepare and return a local target.
             return {
-                source: channelHost,
-                version: version,
-                path: targetPath
+                'source': channelHost,
+                'version': version,
+                'path': targetPath
             };
         }
     }
@@ -128,7 +117,6 @@ requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channel
 
 requestAnalyzer._applyWhitelistedDomains = function () {
 
-    //noinspection JSUnresolvedVariable
     chrome.storage.local.get('whitelistedDomains', function (items) {
         requestAnalyzer.whitelistedDomains = items.whitelistedDomains || {};
     });
diff --git a/core/resources.js b/core/resources.js
index 76b8d06216d3260218d3e95d4ff3c85525030f51..cbc7b7783c5f697ad0a77913603cd0ce8a327f46 100644
--- a/core/resources.js
+++ b/core/resources.js
@@ -20,73 +20,73 @@
 var resources = {
 
     // AngularJS
-    angular: {
-        path: 'resources/angularjs/{version}/angular.min.js.dec',
-        type: 'application/javascript'
+    'angular': {
+        'path': 'resources/angularjs/{version}/angular.min.js.dec',
+        'type': 'application/javascript'
     },
     // Backbone.js
-    backbone: {
-        path: 'resources/backbone.js/{version}/backbone-min.js.dec',
-        type: 'application/javascript'
+    'backbone': {
+        'path': 'resources/backbone.js/{version}/backbone-min.js.dec',
+        'type': 'application/javascript'
     },
     // Dojo
-    dojo: {
-        path: 'resources/dojo/{version}/dojo/dojo.js.dec',
-        type: 'application/javascript'
+    'dojo': {
+        'path': 'resources/dojo/{version}/dojo/dojo.js.dec',
+        'type': 'application/javascript'
     },
     // Ember.js
-    ember: {
-        path: 'resources/ember.js/{version}/ember.min.js.dec',
-        type: 'application/javascript'
+    'ember': {
+        'path': 'resources/ember.js/{version}/ember.min.js.dec',
+        'type': 'application/javascript'
     },
     // Ext Core
-    extCore: {
-        path: 'resources/ext-core/{version}/ext-core.js.dec',
-        type: 'application/javascript'
+    'extCore': {
+        'path': 'resources/ext-core/{version}/ext-core.js.dec',
+        'type': 'application/javascript'
     },
     // jQuery
-    jQuery: {
-        path: 'resources/jquery/{version}/jquery.min.js.dec',
-        type: 'application/javascript'
+    'jQuery': {
+        'path': 'resources/jquery/{version}/jquery.min.js.dec',
+        'type': 'application/javascript'
     },
     // jQuery UI
-    jQueryUI: {
-        path: 'resources/jqueryui/{version}/jquery-ui.min.js.dec',
-        type: 'application/javascript'
+    'jQueryUI': {
+        'path': 'resources/jqueryui/{version}/jquery-ui.min.js.dec',
+        'type': 'application/javascript'
     },
     // Modernizr
-    modernizr: {
-        path: 'resources/modernizr/{version}/modernizr.min.js.dec',
-        type: 'application/javascript'
+    'modernizr': {
+        'path': 'resources/modernizr/{version}/modernizr.min.js.dec',
+        'type': 'application/javascript'
     },
     // MooTools
-    mootools: {
-        path: 'resources/mootools/{version}/mootools-yui-compressed.js.dec',
-        type: 'application/javascript'
+    'mootools': {
+        'path': 'resources/mootools/{version}/mootools-yui-compressed.js.dec',
+        'type': 'application/javascript'
     },
     // Prototype
-    prototypeJS: {
-        path: 'resources/prototype/{version}/prototype.js.dec',
-        type: 'application/javascript'
+    'prototypeJS': {
+        'path': 'resources/prototype/{version}/prototype.js.dec',
+        'type': 'application/javascript'
     },
     // Scriptaculous
-    scriptaculous: {
-        path: 'resources/scriptaculous/{version}/scriptaculous.js.dec',
-        type: 'application/javascript'
+    'scriptaculous': {
+        'path': 'resources/scriptaculous/{version}/scriptaculous.js.dec',
+        'type': 'application/javascript'
     },
     // SWFObject
-    swfobject: {
-        path: 'resources/swfobject/{version}/swfobject.js.dec',
-        type: 'application/javascript'
+    'swfobject': {
+        'path': 'resources/swfobject/{version}/swfobject.js.dec',
+        'type': 'application/javascript'
     },
     // Underscore.js
-    underscore: {
-        path: 'resources/underscore.js/{version}/underscore-min.js.dec',
-        type: 'application/javascript'
+    'underscore': {
+        'path': 'resources/underscore.js/{version}/underscore-min.js.dec',
+        'type': 'application/javascript'
     },
     // Web Font Loader
-    webfont: {
-        path: 'resources/webfont/{version}/webfont.js.dec',
-        type: 'application/javascript'
+    'webfont': {
+        'path': 'resources/webfont/{version}/webfont.js.dec',
+        'type': 'application/javascript'
     }
 };
diff --git a/core/state-manager.js b/core/state-manager.js
index 6191872fac62e99af1bbf2196728eea7a0d82c6d..bfe475db0431b006f5fec07f3bfd54e274504a64 100644
--- a/core/state-manager.js
+++ b/core/state-manager.js
@@ -19,15 +19,6 @@
 
 var stateManager = {};
 
-/**
- * Constants
- */
-
-const BLOCKING_ACTION = 'blocking';
-const HOST_PREFIX = '*://';
-const HOST_SUFFIX = '/*';
-const REQUEST_HEADERS = 'requestHeaders';
-
 /**
  * Public Methods
  */
@@ -47,15 +38,15 @@ stateManager.registerInjection = function (tabIdentifier, injection) {
         if (injectionCount > 0) {
 
             chrome.browserAction.setBadgeText({
-                tabId: tabIdentifier,
-                text: injectionCount.toString()
+                'tabId': tabIdentifier,
+                'text': injectionCount.toString()
             });
 
         } else {
 
             chrome.browserAction.setBadgeText({
-                tabId: tabIdentifier,
-                text: ''
+                'tabId': tabIdentifier,
+                'text': ''
             });
         }
     }
@@ -130,7 +121,7 @@ stateManager._createTab = function (tab) {
             });
         });
 
-    }, requestFilters, [BLOCKING_ACTION]);
+    }, requestFilters, [REQUEST_BLOCKING]);
 };
 
 stateManager._removeTab = function (tabIdentifier) {
@@ -151,8 +142,8 @@ stateManager._updateTab = function (details) {
     if (stateManager.showIconBadge === true) {
 
         chrome.browserAction.setBadgeText({
-            tabId: tabIdentifier,
-            text: ''
+            'tabId': tabIdentifier,
+            'text': ''
         });
     }
 
@@ -180,7 +171,7 @@ stateManager._stripMetadata = function (requestDetails) {
 stateManager._handleStorageChanged = function (changes) {
 
     if ('showIconBadge' in changes) {
-        
+
         stateManager.showIconBadge = changes.showIconBadge.newValue;
 
         if (changes.showIconBadge.newValue !== true) {
@@ -199,13 +190,13 @@ stateManager._handleStorageChanged = function (changes) {
 
         onBeforeSendHeaders.removeListener(stateManager._stripMetadata, {
             'urls': stateManager.validHosts
-        }, [BLOCKING_ACTION, REQUEST_HEADERS]);
+        }, [REQUEST_BLOCKING, REQUEST_HEADERS]);
 
         if (changes.stripMetadata.newValue !== false) {
-            
+
             onBeforeSendHeaders.addListener(stateManager._stripMetadata, {
                 'urls': stateManager.validHosts
-            }, [BLOCKING_ACTION, REQUEST_HEADERS]);
+            }, [REQUEST_BLOCKING, REQUEST_HEADERS]);
         }
     }
 };
@@ -213,8 +204,8 @@ stateManager._handleStorageChanged = function (changes) {
 stateManager._removeIconBadgeFromTab = function (tab) {
 
     chrome.browserAction.setBadgeText({
-        tabId: tab.id,
-        text: ''
+        'tabId': tab.id,
+        'text': ''
     });
 };
 
@@ -228,10 +219,6 @@ stateManager.validHosts = [];
 
 for (let mapping in mappings) {
 
-    if (!mappings.hasOwnProperty(mapping)) {
-        continue;
-    }
-
     let supportedHost = HOST_PREFIX + mapping + HOST_SUFFIX;
     stateManager.validHosts.push(supportedHost);
 }
@@ -252,7 +239,7 @@ chrome.tabs.onCreated.addListener(stateManager._createTab);
 chrome.tabs.onRemoved.addListener(stateManager._removeTab);
 
 chrome.webNavigation.onCommitted.addListener(stateManager._updateTab, {
-    url: [{urlContains: ':'}]
+    'url': [{'urlContains': ':'}]
 });
 
 chrome.webRequest.onErrorOccurred.addListener(function (requestDetails) {
@@ -277,6 +264,6 @@ chrome.webRequest.onBeforeRedirect.addListener(function (requestDetails) {
 
 chrome.webRequest.onBeforeSendHeaders.addListener(stateManager._stripMetadata, {
     'urls': stateManager.validHosts
-}, [BLOCKING_ACTION, REQUEST_HEADERS]);
+}, [REQUEST_BLOCKING, REQUEST_HEADERS]);
 
 chrome.storage.onChanged.addListener(stateManager._handleStorageChanged);
diff --git a/manifest.json b/manifest.json
index 55c1fc351e0ec0809b5440808e762bfa67d97d5b..ad9c92d822ba4c76a1577fbc20fe86bd89c99cb8 100644
--- a/manifest.json
+++ b/manifest.json
@@ -44,8 +44,7 @@
   },
 
   "options_ui": {
-    "page": "pages/options/options.html",
-    "browser_style": false
+    "page": "pages/options/options.html"
   },
 
   "applications": {
diff --git a/modules/internal/.gitkeep b/modules/internal/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/modules/internal/helpers.js b/modules/internal/helpers.js
new file mode 100644
index 0000000000000000000000000000000000000000..c5798f7c1d054c2f424a6fe48e4e81b6e52baea1
--- /dev/null
+++ b/modules/internal/helpers.js
@@ -0,0 +1,169 @@
+/**
+ * Internal Helper Module
+ * Belongs to Decentraleyes.
+ *
+ * @author      Thomas Rientjes
+ * @since       2017-10-26
+ * @license     MPL 2.0
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+'use strict';
+
+/**
+ * Helpers
+ */
+
+var helpers = {};
+
+/**
+ * Public Functions
+ */
+
+helpers.insertI18nContentIntoDocument = function (document) {
+
+    let scriptDirection, i18nElements;
+
+    scriptDirection = helpers.determineScriptDirection(navigator.language);
+    i18nElements = document.querySelectorAll('[data-i18n-content]');
+
+    i18nElements.forEach(function (i18nElement) {
+
+        let i18nMessageName = i18nElement.getAttribute('data-i18n-content');
+
+        i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName);
+        i18nElement.setAttribute('dir', scriptDirection);
+    });
+};
+
+helpers.insertI18nTitlesIntoDocument = function (document) {
+
+    let scriptDirection, i18nElements;
+
+    scriptDirection = helpers.determineScriptDirection(navigator.language);
+    i18nElements = document.querySelectorAll('[data-i18n-title]');
+
+    i18nElements.forEach(function (i18nElement) {
+
+        let i18nMessageName = i18nElement.getAttribute('data-i18n-title');
+
+        i18nElement.setAttribute('title', chrome.i18n.getMessage(i18nMessageName));
+        i18nElement.setAttribute('dir', scriptDirection);
+    });
+};
+
+helpers.languageIsFullySupported = function (language) {
+
+    let languageSupported, supportedLanguages;
+
+    languageSupported = false;
+
+    supportedLanguages = [
+        'ar', 'bg', 'zh-CN', 'zh-TW', 'nl', 'en', 'et', 'fi', 'fr', 'de', 'he',
+        'hu', 'is', 'id', 'pl', 'pt-PT', 'ro', 'es', 'tr'
+    ];
+
+    for (let supportedLanguage of supportedLanguages) {
+
+        if (language.search(supportedLanguage) !== -1) {
+            languageSupported = true;
+        }
+    }
+
+    return languageSupported;
+};
+
+helpers.determineCdnName = function (domainName) {
+
+    switch (domainName) {
+
+    case 'ajax.googleapis.com':
+        return 'Google Hosted Libraries';
+    case 'ajax.aspnetcdn.com':
+        return 'Microsoft Ajax CDN';
+    case 'ajax.microsoft.com':
+        return 'Microsoft Ajax CDN [Deprecated]';
+    case 'cdnjs.cloudflare.com':
+        return 'CDNJS (Cloudflare)';
+    case 'code.jquery.com':
+        return 'jQuery CDN (MaxCDN)';
+    case 'cdn.jsdelivr.net':
+        return 'jsDelivr (MaxCDN)';
+    case 'yastatic.net':
+        return 'Yandex CDN';
+    case 'yandex.st':
+        return 'Yandex CDN [Deprecated]';
+    case 'libs.baidu.com':
+        return 'Baidu CDN';
+    case 'lib.sinaapp.com':
+        return 'Sina Public Resources';
+    case 'upcdn.b0.upaiyun.com':
+        return 'UpYun Library';
+    default:
+        return 'Unknown';
+    }
+};
+
+helpers.determineResourceName = function (filename) {
+
+    switch (filename) {
+
+    case 'angular.min.js.dec':
+        return 'AngularJS';
+    case 'backbone-min.js.dec':
+        return 'Backbone.js';
+    case 'dojo.js.dec':
+        return 'Dojo';
+    case 'ember.min.js.dec':
+        return 'Ember.js';
+    case 'ext-core.js.dec':
+        return 'Ext Core';
+    case 'jquery.min.js.dec':
+        return 'jQuery';
+    case 'jquery-ui.min.js.dec':
+        return 'jQuery UI';
+    case 'modernizr.min.js.dec':
+        return 'Modernizr';
+    case 'mootools-yui-compressed.js.dec':
+        return 'MooTools';
+    case 'prototype.js.dec':
+        return 'Prototype';
+    case 'scriptaculous.js.dec':
+        return 'Scriptaculous';
+    case 'swfobject.js.dec':
+        return 'SWFObject';
+    case 'underscore-min.js.dec':
+        return 'Underscore.js';
+    case 'webfont.js.dec':
+        return 'Web Font Loader';
+    default:
+        return 'Unknown';
+    }
+};
+
+helpers.determineScriptDirection = function (language) {
+
+    let rightToLeftLanguages, scriptDirection;
+
+    rightToLeftLanguages = ['ar', 'he'];
+
+    if (rightToLeftLanguages.indexOf(language) === -1) {
+        scriptDirection = 'ltr';
+    } else {
+        scriptDirection = 'rtl';
+    }
+
+    return scriptDirection;
+};
+
+helpers.formatVersion = function (version) {
+
+    if (version.indexOf('beta') === -1) {
+        return version;
+    } else {
+        return 'BETA';
+    }
+};
diff --git a/pages/background/background.html b/pages/background/background.html
index 06238b3f338c77c97d8bcba5dbcfa8a6c281bda5..f61861d48437ae778b4ff62e1c200e27186ea047 100644
--- a/pages/background/background.html
+++ b/pages/background/background.html
@@ -10,6 +10,9 @@
 
     <body>
 
+        <script src="../../modules/internal/helpers.js"></script>
+
+        <script src="../../core/constants.js"></script>
         <script src="../../core/files.js"></script>
         <script src="../../core/resources.js"></script>
         <script src="../../core/mappings.js"></script>
diff --git a/pages/options/options.html b/pages/options/options.html
index f75f177404b126873bb93b46c8bd1bf8d276c830..c18429774c15a9de468e75ff10a9c69a38e72041 100644
--- a/pages/options/options.html
+++ b/pages/options/options.html
@@ -18,6 +18,9 @@
 
     <body>
 
+        <script src="../../core/constants.js"></script>
+        <script src="../../modules/internal/helpers.js"></script>
+
         <script src="options.js"></script>
 
         <section class="option">
diff --git a/pages/options/options.js b/pages/options/options.js
index 85988c12a054ad31a357b5317315a701d5d907d2..d91d2cc91254fc47d7e88b6e3e971d0037c0fc7a 100644
--- a/pages/options/options.js
+++ b/pages/options/options.js
@@ -19,55 +19,24 @@
 
 var options = {};
 
-/**
- * Constants
- */
-
-const WEB_PREFIX_VALUE = 'www.';
-const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length;
-const VALUE_SEPARATOR = ';';
-
 /**
  * Private Methods
  */
 
-options._determineScriptDirection = function (language) {
-
-    let rightToLeftLanguages, scriptDirection;
-
-    rightToLeftLanguages = ['ar', 'he'];
-
-    if (rightToLeftLanguages.indexOf(language) !== -1) {
-        scriptDirection = 'rtl';
-    } else {
-        scriptDirection = 'ltr';
-    }
-
-    return scriptDirection;
+options._getOptionElement = function (optionKey) {
+    return document.querySelector(`[data-option=${optionKey}]`);
 };
 
-options._languageIsFullySupported = function (language) {
-
-    let languageSupported, supportedLanguages;
+function _normalizeDomain (domain) {
 
-    languageSupported = false;
-
-    supportedLanguages = ['ar', 'bg', 'zh-CN', 'zh-TW', 'nl', 'en', 'et', 'fi',
-        'fr', 'de', 'he', 'hu', 'is', 'id', 'pl', 'pt-PT', 'ro', 'es', 'tr'];
-
-    for (let supportedLanguage of supportedLanguages) {
+    domain = domain.toLowerCase().trim();
 
-        if (language.search(supportedLanguage) !== -1) {
-            languageSupported = true;
-        }
+    if (domain.startsWith(WEB_PREFIX_VALUE)) {
+        domain = domain.slice(WEB_PREFIX_LENGTH);
     }
 
-    return languageSupported;
-};
-
-options._getOptionElement = function (optionKey) {
-    return document.querySelector('[data-option=' + optionKey + ']');
-};
+    return domain;
+}
 
 /**
  * Initializations
@@ -75,13 +44,12 @@ options._getOptionElement = function (optionKey) {
 
 document.addEventListener('DOMContentLoaded', function () {
 
-    let i18nElements, scriptDirection, languageSupported, optionElements;
+    let scriptDirection, languageSupported, optionElements;
 
-    i18nElements = document.querySelectorAll('[data-i18n-content]');
-    scriptDirection = options._determineScriptDirection(navigator.language);
+    scriptDirection = helpers.determineScriptDirection(navigator.language);
     document.body.setAttribute('dir', scriptDirection);
 
-    languageSupported = options._languageIsFullySupported(navigator.language);
+    languageSupported = helpers.languageIsFullySupported(navigator.language);
 
     if (languageSupported === false) {
 
@@ -89,11 +57,7 @@ document.addEventListener('DOMContentLoaded', function () {
         localeNoticeElement.setAttribute('class', 'notice');
     }
 
-    i18nElements.forEach(function (i18nElement) {
-
-        let i18nMessageName = i18nElement.getAttribute('data-i18n-content');
-        i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName);
-    });
+    helpers.insertI18nContentIntoDocument(document);
 
     optionElements = {
         'showIconBadge': options._getOptionElement('showIconBadge'),
@@ -111,7 +75,7 @@ document.addEventListener('DOMContentLoaded', function () {
         domainWhitelist = '';
 
         Object.keys(whitelistedDomains).forEach(function (domain) {
-            domainWhitelist = domainWhitelist + domain + ';';
+            domainWhitelist = `${domainWhitelist}${domain};`;
         });
 
         domainWhitelist = domainWhitelist.slice(0, -1);
@@ -132,11 +96,11 @@ document.addEventListener('DOMContentLoaded', function () {
         optionType = target.getAttribute('type');
 
         switch (optionType) {
-            case 'checkbox':
-                optionValue = target.checked;
-                break;
-            default:
-                optionValue = target.value;
+        case 'checkbox':
+            optionValue = target.checked;
+            break;
+        default:
+            optionValue = target.value;
         }
 
         if (optionKey === 'disablePrefetch') {
@@ -145,7 +109,7 @@ document.addEventListener('DOMContentLoaded', function () {
 
                 // Restore default values of related preference values.
                 chrome.privacy.network.networkPredictionEnabled.clear({});
-            
+
             } else {
 
                 chrome.privacy.network.networkPredictionEnabled.set({
@@ -157,7 +121,7 @@ document.addEventListener('DOMContentLoaded', function () {
         if (optionKey === 'whitelistedDomains') {
 
             let domainWhitelist = optionValue;
-            
+
             optionValue = {};
 
             domainWhitelist.split(VALUE_SEPARATOR).forEach(function (domain) {
@@ -176,18 +140,3 @@ document.addEventListener('DOMContentLoaded', function () {
     optionElements.stripMetadata.addEventListener('change', optionChangedHandler);
     optionElements.whitelistedDomains.addEventListener('keyup', optionChangedHandler);
 });
-
-/**
- * Private Methods
- */
-
-function _normalizeDomain(domain) {
-
-    domain = domain.toLowerCase().trim();
-
-    if (domain.startsWith(WEB_PREFIX_VALUE)) {
-        domain = domain.slice(WEB_PREFIX_LENGTH);
-    }
-
-    return domain;
-}
diff --git a/pages/popup/popup.html b/pages/popup/popup.html
index 53dab5808455c4fb98027736be521a7eb3b12856..9b82ff5cbbedaa56c4dc08f7446388a8e6ed43d7 100644
--- a/pages/popup/popup.html
+++ b/pages/popup/popup.html
@@ -18,6 +18,9 @@
 
 <body>
 
+    <script src="../../core/constants.js"></script>
+    <script src="../../modules/internal/helpers.js"></script>
+
     <script src="popup.js"></script>
 
     <header>
@@ -61,7 +64,7 @@
 
         <span id="testing-utility-link" class="link-text">decentraleyes.org/test</span>
 
-        <div id="options-button" class="button">
+        <div id="options-button" class="button" data-i18n-title="optionsTitle">
             <i class="fas fa-cog" data-fa-transform="grow-2"></i>
         </div>
 
diff --git a/pages/popup/popup.js b/pages/popup/popup.js
index af2996f757b96c4a345e005952bd3592a9f97a7d..cda7eaf5683216a1aaa14aec89be182811afc762 100644
--- a/pages/popup/popup.js
+++ b/pages/popup/popup.js
@@ -19,75 +19,31 @@
 
 var popup = {};
 
-/**
- * Constants
- */
-
-const WEB_DOMAIN_EXPRESSION = /:\/\/(.[^\/]+)(.*)/;
-const WEB_PREFIX_VALUE = 'www.';
-const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length;
-
-/**
- * Private Methods
- */
-
-popup._determineScriptDirection = function (language) {
-
-    let rightToLeftLanguages, scriptDirection;
-
-    rightToLeftLanguages = ['ar', 'he'];
-
-    if (rightToLeftLanguages.indexOf(language) !== -1) {
-        scriptDirection = 'rtl';
-    } else {
-        scriptDirection = 'ltr';
-    }
-
-    return scriptDirection;
-};
-
 /**
  * Initializations
  */
 
 document.addEventListener('DOMContentLoaded', function () {
 
-    let version, optionsButtonElement, optionsTitle, scriptDirection, i18nElements;
-
-    version = browser.runtime.getManifest().version;
-
-    if (version.indexOf('beta') !== -1) {
-        version = 'BETA';
-    }
+    let version, optionsButtonElement, scriptDirection;
 
+    version = helpers.formatVersion(browser.runtime.getManifest().version);
     document.getElementById('version-label').innerText = version;
 
+    scriptDirection = helpers.determineScriptDirection(navigator.language);
     optionsButtonElement = document.getElementById('options-button');
-    optionsTitle = chrome.i18n.getMessage('optionsTitle');
-
-    scriptDirection = popup._determineScriptDirection(navigator.language);
-
-    optionsButtonElement.setAttribute('title', optionsTitle);
-    optionsButtonElement.setAttribute('dir', scriptDirection);
 
-    i18nElements = document.querySelectorAll('[data-i18n-content]');
-
-    i18nElements.forEach(function (i18nElement) {
-
-        let i18nMessageName = i18nElement.getAttribute('data-i18n-content');
-
-        i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName);
-        i18nElement.setAttribute('dir', scriptDirection);
-    });
+    helpers.insertI18nContentIntoDocument(document);
+    helpers.insertI18nTitlesIntoDocument(document);
 
     chrome.storage.local.get('amountInjected', function (items) {
 
         let amountInjected = items.amountInjected || 0;
         document.getElementById('injection-counter').innerText = amountInjected;
 
-        chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
+        chrome.tabs.query({'active': true, 'currentWindow': true}, function (tabs) {
 
-            browser.runtime.getBackgroundPage().then(function (backgroundPage) {
+            chrome.runtime.getBackgroundPage(function (backgroundPage) {
 
                 if (backgroundPage === null) {
                     return;
@@ -130,18 +86,16 @@ document.addEventListener('DOMContentLoaded', function () {
 
                     domainIndicatorElement.innerText = domain;
 
-                    if (!backgroundPage.requestAnalyzer.whitelistedDomains[domain]) {
+                    if (backgroundPage.requestAnalyzer.whitelistedDomains[domain]) {
 
-                        protectionToggleElement.setAttribute('class', 'button button-toggle active');
+                        protectionToggleElement.setAttribute('class', 'button button-toggle');
 
-                        let disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle');
-                        
-                        protectionToggleElement.setAttribute('title', disableProtectionTitle);
-                        protectionToggleElement.setAttribute('dir', scriptDirection);
+                        let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle');
+                        protectionToggleElement.setAttribute('title', enableProtectionTitle);
 
                         protectionToggleElement.addEventListener('click', function () {
 
-                            backgroundPage.stateManager.addDomainToWhitelist(domain).then(function () {
+                            backgroundPage.stateManager.deleteDomainFromWhitelist(domain).then(function () {
 
                                 chrome.tabs.reload(tabs[0].id);
 
@@ -158,14 +112,16 @@ document.addEventListener('DOMContentLoaded', function () {
 
                     } else {
 
-                        protectionToggleElement.setAttribute('class', 'button button-toggle');
+                        protectionToggleElement.setAttribute('class', 'button button-toggle active');
 
-                        let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle');
-                        protectionToggleElement.setAttribute('title', enableProtectionTitle);
+                        let disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle');
+
+                        protectionToggleElement.setAttribute('title', disableProtectionTitle);
+                        protectionToggleElement.setAttribute('dir', scriptDirection);
 
                         protectionToggleElement.addEventListener('click', function () {
 
-                            backgroundPage.stateManager.deleteDomainFromWhitelist(domain).then(function () {
+                            backgroundPage.stateManager.addDomainToWhitelist(domain).then(function () {
 
                                 chrome.tabs.reload(tabs[0].id);
 
@@ -216,42 +172,7 @@ document.addEventListener('DOMContentLoaded', function () {
                     badgeTextNode = document.createTextNode(cdn.length);
                     badgeElement.appendChild(badgeTextNode);
 
-                    switch (injectionSource) {
-
-                    case 'ajax.googleapis.com':
-                        cdnName = 'Google Hosted Libraries';
-                        break;
-                    case 'ajax.aspnetcdn.com':
-                        cdnName = 'Microsoft Ajax CDN';
-                        break;
-                    case 'ajax.microsoft.com':
-                        cdnName = 'Microsoft Ajax CDN [Deprecated]';
-                        break;
-                        case 'cdnjs.cloudflare.com':
-                        cdnName = 'CDNJS (Cloudflare)';
-                        break;
-                    case 'code.jquery.com':
-                        cdnName = 'jQuery CDN (MaxCDN)';
-                        break;
-                    case 'cdn.jsdelivr.net':
-                        cdnName = 'jsDelivr (MaxCDN)';
-                        break;
-                    case 'yastatic.net':
-                        cdnName = 'Yandex CDN';
-                        break;
-                    case 'yandex.st':
-                        cdnName = 'Yandex CDN [Deprecated]';
-                        break;
-                    case 'libs.baidu.com':
-                        cdnName = 'Baidu CDN';
-                        break;
-                    case 'lib.sinaapp.com':
-                        cdnName = 'Sina Public Resources';
-                        break;
-                    case 'upcdn.b0.upaiyun.com':
-                        cdnName = 'UpYun Library';
-                        break;
-                    }
+                    cdnName = helpers.determineCdnName(injectionSource);
 
                     cdnNameTextNode = document.createTextNode(cdnName);
 
@@ -276,59 +197,15 @@ document.addEventListener('DOMContentLoaded', function () {
                         resourcePathDetails = injection.path.split('/');
                         resourceFilename = resourcePathDetails[resourcePathDetails.length - 1];
 
-                        switch (resourceFilename) {
-
-                        case 'angular.min.js.dec':
-                            resourceName = 'AngularJS';
-                            break;
-                        case 'backbone-min.js.dec':
-                            resourceName = 'Backbone.js';
-                            break;
-                        case 'dojo.js.dec':
-                            resourceName = 'Dojo';
-                            break;
-                        case 'ember.min.js.dec':
-                            resourceName = 'Ember.js';
-                            break;
-                        case 'ext-core.js.dec':
-                            resourceName = 'Ext Core';
-                            break;
-                        case 'jquery.min.js.dec':
-                            resourceName = 'jQuery';
-                            break;
-                        case 'jquery-ui.min.js.dec':
-                            resourceName = 'jQuery UI';
-                            break;
-                        case 'modernizr.min.js.dec':
-                            resourceName = 'Modernizr';
-                            break;
-                        case 'mootools-yui-compressed.js.dec':
-                            resourceName = 'MooTools';
-                            break;
-                        case 'prototype.js.dec':
-                            resourceName = 'Prototype';
-                            break;
-                        case 'scriptaculous.js.dec':
-                            resourceName = 'Scriptaculous';
-                            break;
-                        case 'swfobject.js.dec':
-                            resourceName = 'SWFObject';
-                            break;
-                        case 'underscore-min.js.dec':
-                            resourceName = 'Underscore.js';
-                            break;
-                        case 'webfont.js.dec':
-                            resourceName = 'Web Font Loader';
-                            break;
-                        }
-
-                        resourceNameTextNode = document.createTextNode('- ' + resourceName);
+                        resourceName = helpers.determineResourceName(resourceFilename);
+
+                        resourceNameTextNode = document.createTextNode(`- ${resourceName}`);
                         subListItemElement.appendChild(resourceNameTextNode);
 
                         sideNoteElement = document.createElement('span');
                         sideNoteElement.setAttribute('class', 'side-note');
 
-                        sideNoteTextNode = document.createTextNode(' v' + injection.version);
+                        sideNoteTextNode = document.createTextNode(` v${injection.version}`);
 
                         sideNoteElement.appendChild(sideNoteTextNode);
                         subListItemElement.appendChild(sideNoteElement);
@@ -363,7 +240,7 @@ document.addEventListener('DOMContentLoaded', function () {
 
         if (event.button === 0 || event.button === 1) {
 
-            browser.tabs.create({
+            chrome.tabs.create({
                 'url': 'https://decentraleyes.org/test',
                 'active': (event.button === 0)
             });