diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7146fb3..9998af8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,30 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [1.16.0] - 2020-03-20
+
+### Compatibility note
+- Require Firefox >= 55
+- Require Chrome >= 22
+
+### Added
+- Added ETag header filtering [#362](https://gitlab.com/KevinRoebert/ClearUrls/issues/362), [#440](https://gitlab.com/KevinRoebert/ClearUrls/issues/440). Hint: Cache must be cleared before first use, to delete the already existing ETags.
+
+### Fixed
+- Fixed spontaneous disappearance of the badged
+- Fixed wrong counting of blocked elements corrected (too little was  ;D)
+
+### Changed
+- Updated all translation
+- Changed badged font color to #FFFFFF
+- Changed watchdog behavior as follows [#428](https://gitlab.com/KevinRoebert/ClearUrls/issues/428), [#431](https://gitlab.com/KevinRoebert/ClearUrls/issues/431), [#429](https://gitlab.com/KevinRoebert/ClearUrls/issues/429): 
+   - Increased watchdog interval to 60 seconds
+   - Executed watchdog only if ClearURLs is also active
+   - Watchdog restarts ClearURLs at most 3 times and only if ClearURLs has rules
+- Changed behavior of downloading rules [#428](https://gitlab.com/KevinRoebert/ClearUrls/issues/428), [#431](https://gitlab.com/KevinRoebert/ClearUrls/issues/431), [#429](https://gitlab.com/KevinRoebert/ClearUrls/issues/429):
+   - If download of hash file fails and no local rules are available, then ClearURLs displays `hash_status_code_5` and deactivates itself
+   - If download of rules file fails and no local rules are available, then ClearURLs displays `hash_status_code_5` and deactivates itself
+
 ## [1.15.0] - 2020-02-16
 
 ### Compatibility note
diff --git a/_locales/de/messages.json b/_locales/de/messages.json
index 7941911..801a4c9 100644
--- a/_locales/de/messages.json
+++ b/_locales/de/messages.json
@@ -306,8 +306,14 @@
         "description": "Diese Zeichenkette wird als Titel für das Referral-Marketing verwendet."
     },
     "watchdog": {
-        "message": "[ClearURLs]: Der Watchdog hat ein Problem festgestellt. ClearURLs wird neugestartet.",
-        "description": "Diese Zeichenkette wird als Text für den Watchdog verwendet."
+        "message": "[ClearURLs]: Der Watchdog hat ein Problem festgestellt und ist bereits das $TIMES$-te mal gescheitert.",
+        "description": "Diese Zeichenkette wird als Text für den Watchdog verwendet.",
+        "placeholders": {
+            "times": {
+                "content": "$1",
+                "example": "3"
+            }
+        }
     },
     "domain_blocking_enabled": {
         "message": "Erlaube Domain-Blocking (Kann zu Problemen auf Seiten führen, die AdBlocker nicht erlauben)",
@@ -328,5 +334,17 @@
     "ping_blocking_enabled_title": {
         "message": "Blockiere Hyperlink Auditing Anfragen",
         "description": "Diese Zeichenkette wird als Titel für das Hyperlink Auditing-Blocking verwendet."
+    },
+    "eTag_filtering_log": {
+        "message": "ETag-Header wurde aus dieser Anfrage entfernt",
+        "description": "Diese Zeichenkette wird für das Filtern von ETag-Headern im ClearURL-Protokoll verwendet."
+    },
+    "eTag_filtering_enabled": {
+        "message": "Filtert die ETag-Header aus den Anfragen (Siehe auch diesen Artikel)",
+        "description": "Diese Zeichenkette wird als Beschreibung für das Filtern von ETag-Headern verwendet."
+    },
+    "eTag_filtering_enabled_title": {
+        "message": "Filtert ETag-Header. Info: Cache muss vor der ersten Benutzung geleert werden.",
+        "description": "Diese Zeichenkette wird als Titel für das Filtern von ETag-Headern verwendet."
     }
 }
\ No newline at end of file
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index f26df0f..2891008 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -306,8 +306,14 @@
         "description": "This string is used as title for the referral marketing switch"
     },
     "watchdog": {
-        "message": "[ClearURLs]: The watchdog has detected a problem. ClearURLs is restarting.",
-        "description": "This string is used as text for the watchdog"
+        "message": "[ClearURLs]: The watchdog has detected a problem and has already failed $TIMES$ times.",
+        "description": "This string is used as text for the watchdog",
+        "placeholders": {
+            "times": {
+                "content": "$1",
+                "example": "3"
+            }
+        }
     },
     "domain_blocking_enabled": {
         "message": "Allow domain blocking (Can lead to problems on pages that do not allow AdBlockers)",
@@ -328,5 +334,17 @@
     "ping_blocking_enabled_title": {
         "message": "Block hyperlink auditing",
         "description": "This string is used as title for the hyperlink auditing blocking switch"
+    },
+    "eTag_filtering_log": {
+        "message": "ETag header was removed from this request",
+        "description": "This string is used on ETag header filtering in the ClearURLs log."
+    },
+    "eTag_filtering_enabled": {
+        "message": "Filters ETag headers from requests (See also this article)",
+        "description": "This string is used as label for the ETag header filtering switch"
+    },
+    "eTag_filtering_enabled_title": {
+        "message": "Filters ETag headers. Hint: Cache must be cleared before first use.",
+        "description": "This string is used as title for the ETag header filtering switch"
     }
 }
\ No newline at end of file
diff --git a/_locales/es/messages.json b/_locales/es/messages.json
index 9ebaca8..f39e0f5 100644
--- a/_locales/es/messages.json
+++ b/_locales/es/messages.json
@@ -301,10 +301,6 @@
         "message": "Permitir márketing de referidos",
         "description": "This string is used as title for the referral marketing switch"
     },
-    "watchdog": {
-        "message": "[ClearURLs]: El watchdog detectado un problema. ClearURLs será reiniciado.",
-        "description": "This string is used as text for the watchdog"
-    },
     "domain_blocking_enabled": {
         "message": "Permitir bloqueo de dominios (Puede provocar problemas con sitios que no permitan bloqueadores de anuncios)",
         "description": "This string is used as label for the domain blocking switch"
diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json
index 8ae135d..08ddf54 100644
--- a/_locales/fr/messages.json
+++ b/_locales/fr/messages.json
@@ -301,10 +301,6 @@
         "message": "Permettre certaines actions commerciales",
         "description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
     },
-    "watchdog": {
-        "message": "[ClearURLs]: Temps ou délais d’exécution imparti dépassé. ClearURLs doit redémarrer.",
-        "description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
-    },
     "domain_blocking_enabled": {
         "message": "Bloquer les atteintes à la vie privée. Cependant, des sites décèlent la technique de protection et dysfonctionnent délibérément ou affichent des avertissements",
         "description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
diff --git a/_locales/it/messages.json b/_locales/it/messages.json
index c6b8335..cd1756a 100644
--- a/_locales/it/messages.json
+++ b/_locales/it/messages.json
@@ -301,10 +301,6 @@
         "message": "Permette l'utilizzo del referral marketing (esempio: Amazon)",
         "description": "This string is used as title for the referral marketing switch"
     },
-    "watchdog": {
-        "message": "[ClearURLs]: Il sistema di controllo ha identificato un problema. ClearURLs verrà riavviato.",
-        "description": "This string is used as text for the watchdog"
-    },
     "domain_blocking_enabled": {
         "message": "Permetti il blocco dei domini (può portare a problemi su pagine che non consentono AdBlocker)",
         "description": "This string is used as label for the domain blocking switch"
diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json
index 84997c2..520a004 100644
--- a/_locales/ru/messages.json
+++ b/_locales/ru/messages.json
@@ -301,10 +301,6 @@
         "message": "Разрешить рефералы маркетинга",
         "description": "This string is used as title for the referral marketing switch"
     },
-    "watchdog": {
-        "message": "[ClearURLs]: сторожевой таймер обнаружил проблему. ClearURLs будет перезапущен.",
-        "description": "This string is used as text for the watchdog"
-    },
     "domain_blocking_enabled": {
         "message": "Разрешить блокировку домена (может вызвать проблемы на сайтах, которые запрещают AdBlocker)",
         "description": "This string is used as label for the domain blocking switch"
diff --git a/_locales/sv_SE/messages.json b/_locales/sv_SE/messages.json
index ba919e2..551a160 100644
--- a/_locales/sv_SE/messages.json
+++ b/_locales/sv_SE/messages.json
@@ -301,10 +301,6 @@
         "message": "Tillåt referral marketing",
         "description": "This string is used as title for the referral marketing switch"
     },
-    "watchdog": {
-        "message": "[ClearURLs]: Ett problem har upptäckts. ClearURLs startar om.",
-        "description": "This string is used as text for the watchdog"
-    },
     "domain_blocking_enabled": {
         "message": "Tillåt domänblockering (Kan leda till problem på sidor som inte tillåter AdBlockers)",
         "description": "This string is used as label for the domain blocking switch"
diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json
index 2874ffb..61ba6c0 100644
--- a/_locales/tr/messages.json
+++ b/_locales/tr/messages.json
@@ -301,10 +301,6 @@
         "message": "Tavsiye pazarlamasına izin verir",
         "description": "Bu dize tavsiye pazarlama anahtarı için başlık olarak kullanılır"
     },
-    "watchdog": {
-        "message": "[ClearURL'ler]: Güvenlik Zamanlayıcısı bir sorun tespit etti. ClearURL'ler yeniden başlatıldı.",
-        "description": "Bu dize güvenlik zamanlayıcısı için metin olarak kullanılır."
-    },
     "domain_blocking_enabled": {
         "message": "Alan adı engellemeye izin ver (Reklam Engelleyicilere izin vermeyen sayfalarda sorunlara neden olabilir)",
         "description": "Bu dize, alan adı engelleme anahtarı için etiket olarak kullanılır"
diff --git a/clearurls.js b/clearurls.js
index c5eec5d..bf4d388 100644
--- a/clearurls.js
+++ b/clearurls.js
@@ -22,13 +22,10 @@
 */
 var providers = [];
 var prvKeys = [];
-var badges = [];
-var tabid = 0;
 var siteBlockedAlert = 'javascript:void(0)';
 var dataHash;
 var localDataHash;
 var os;
-var currentURL;
 
 /**
  * Helper function which remove the tracking fields
@@ -36,10 +33,11 @@ var currentURL;
  *
  * @param  {Provider} provider      Provider-Object
  * @param pureUrl                   URL as String
- * @param {boolean} quiet   if the action should be displayed in log and statistics
+ * @param {boolean} quiet           if the action should be displayed in log and statistics
+ * @param {requestDetails} request  the request details
  * @return {Array}                  Array with changes and url fields
  */
-function removeFieldsFormURL(provider, pureUrl, quiet = false) {
+function removeFieldsFormURL(provider, pureUrl, quiet = false, request = null) {
     let url = pureUrl;
     let domain = "";
     let fragments = "";
@@ -70,7 +68,7 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false) {
                 pushToLog(beforeReplace, url, rawRule);
             }
 
-            increaseBadged(quiet);
+            increaseBadged(quiet, request);
             changes = true;
         }
     });
@@ -91,7 +89,11 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false) {
         url = decodeURL(re);
 
         //Log the action
-        if (!quiet) pushToLog(pureUrl, url, translate('log_redirect'));
+        if (!quiet) {
+            pushToLog(pureUrl, url, translate('log_redirect'));
+            increaseGlobalURLCounter(1);
+            increaseBadged(false, request)
+        };
 
         return {
             "redirect": true,
@@ -131,7 +133,7 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false) {
                     if (!quiet) pushToLog(tempBeforeURL, tempURL, rule);
                 }
 
-                increaseBadged(quiet);
+                increaseBadged(quiet, request);
                 changes = true;
             }
         });
@@ -146,7 +148,8 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false) {
 
     if (provider.isCaneling() && storage.domainBlocking) {
         if (!quiet) pushToLog(pureUrl, pureUrl, translate('log_domain_blocked'));
-        increaseBadged(quiet);
+        increaseGlobalURLCounter(1);
+        increaseBadged(quiet, request);
         cancel = true;
     }
 
@@ -228,13 +231,26 @@ function start() {
     }
 
     /**
-     * Get the hash for the rule file on github.
+     * Deactivates ClearURLs, if no rules can be downloaded and also no old rules in storage
+     */
+    function deactivateOnFailure() {
+        if(storage.ClearURLsData.length === 0)  {
+            storage.globalStatus = false;
+            storage.dataHash = "";
+            changeIcon();
+            storeHashStatus(5);
+            saveOnExit();
+        }
+    }
+
+    /**
+     * Get the hash for the rule file on GitLab.
      * Check the hash with the hash form the local file.
      * If the hash has changed, then download the new rule file.
      * Else do nothing.
      */
     function getHash() {
-        //Get the target hash from github
+        //Get the target hash from GitLab
         fetch(storage.hashURL)
             .then(function (response) {
                 const responseTextHash = response.clone().text().then(function (responseTextHash) {
@@ -250,6 +266,7 @@ function start() {
                         }
                     } else {
                         dataHash = false;
+                        deactivateOnFailure();
                     }
                 });
             });
@@ -279,6 +296,8 @@ function start() {
                     storage.ClearURLsData = JSON.parse(storage.ClearURLsData);
                     toObject(storage.ClearURLsData);
                     saveOnDisk(['ClearURLsData', 'dataHash', 'hashStatus']);
+                } else {
+                    deactivateOnFailure();
                 }
             });
         }
@@ -559,7 +578,8 @@ function start() {
 
             if (storage.pingBlocking && storage.pingRequestTypes.includes(request.type)) {
                 pushToLog(request.url, request.url, translate('log_ping_blocked'));
-                increaseBadged();
+                increaseBadged(false, request);
+                increaseGlobalURLCounter(1);
                 return {cancel: true};
             }
 
@@ -567,9 +587,8 @@ function start() {
             * Call for every provider the removeFieldsFormURL method.
             */
             for (let i = 0; i < providers.length; i++) {
-
                 if (providers[i].matchURL(request.url)) {
-                    result = removeFieldsFormURL(providers[i], request.url);
+                    result = removeFieldsFormURL(providers[i], request.url, false, request);
                 }
 
                 /*
@@ -629,39 +648,6 @@ function start() {
     getHash();
     setBadgedStatus();
 
-    /**
-     * Call by each tab is updated.
-     * And if url has changed.
-     */
-    function handleUpdated(tabId, changeInfo, tabInfo) {
-        if (changeInfo.url) {
-            delete badges[tabId];
-        }
-        currentURL = tabInfo.url;
-    }
-
-    /**
-     * Call by each tab is updated.
-     */
-    browser.tabs.onUpdated.addListener(handleUpdated);
-
-    /**
-     * Call by each tab change to set the actual tab id
-     */
-    function handleActivated(activeInfo) {
-        tabid = activeInfo.tabId;
-        browser.tabs.get(tabid).then(function (tab) {
-            if (!browser.runtime.lastError) { // https://gitlab.com/KevinRoebert/ClearUrls/issues/346
-                currentURL = tab.url;
-            }
-        }).catch(handleError);
-    }
-
-    /**
-     * Call by each tab change.
-     */
-    browser.tabs.onActivated.addListener(handleActivated);
-
     /**
      * Check the request.
      */
@@ -697,53 +683,3 @@ function start() {
         ["blocking"]
     );
 }
-
-/**
- * Function to log all activities from ClearUrls.
- * Only logging when activated.
- * The log is only temporary saved in the cache and will
- * permanently saved with the saveLogOnClose function.
- *
- * @param beforeProcessing  the url before the clear process
- * @param afterProcessing   the url after the clear process
- * @param rule              the rule that triggered the process
- */
-function pushToLog(beforeProcessing, afterProcessing, rule) {
-    const limit = storage.logLimit;
-    if (storage.loggingStatus && limit !== 0) {
-        if (limit > 0 && !isNaN(limit)) {
-            while (storage.log.log.length >= limit) {
-                storage.log.log.shift();
-            }
-        }
-
-        storage.log.log.push(
-            {
-                "before": beforeProcessing,
-                "after": afterProcessing,
-                "rule": rule,
-                "timestamp": Date.now()
-            }
-        );
-        deferSaveOnDisk('log');
-    }
-}
-
-/**
- * Increases the badged by one.
- */
-function increaseBadged(quiet = false) {
-    if (badges[tabid] == null) badges[tabid] = 0;
-
-    if (!quiet) increaseURLCounter();
-
-    checkOSAndroid().then((res) => {
-        if (!res) {
-            if (storage.badgedStatus && !quiet) {
-                browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid}).catch(handleError);
-            } else {
-                browser.browserAction.setBadgeText({text: "", tabId: tabid}).catch(handleError);
-            }
-        }
-    });
-}
diff --git a/core_js/badgedHandler.js b/core_js/badgedHandler.js
new file mode 100644
index 0000000..df3817f
--- /dev/null
+++ b/core_js/badgedHandler.js
@@ -0,0 +1,77 @@
+/*
+* ClearURLs
+* Copyright (c) 2017-2020 Kevin Röbert
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program.  If not, see 
+                    
+                    
+