diff -r 716a390b8188 web/org.openbravo.mobile.core/source/offline/ob-fetch-manifest.js
--- a/web/org.openbravo.mobile.core/source/offline/ob-fetch-manifest.js	Wed Aug 21 05:44:08 2019 +0000
+++ b/web/org.openbravo.mobile.core/source/offline/ob-fetch-manifest.js	Tue Oct 20 10:37:53 2020 +0530
@@ -9,16 +9,14 @@
 
 /*global fetch*/
 
-OB.UTIL.fetchApplicationSources = function(
-  successNoRefreshCallback,
-  errorCallback
-) {
+OB.UTIL.fetchApplicationSources = function(successCallback, errorCallback) {
   var setManifest = false;
   var manifest;
   //make sure that Service Workers are supported.
   var url =
     '../../org.openbravo.mobile.core/OBPOS_Main/AppCacheManifest?_appName=WebPOS';
   var oldManifest;
+  var failResource = [];
 
   function send_message_to_sw() {
     var appData = {};
@@ -27,6 +25,90 @@
     navigator.serviceWorker.controller.postMessage(appData);
   }
 
+  function controllerEventListener(e) {
+    if (setManifest === true) {
+      send_message_to_sw();
+    }
+  }
+
+  function messageEventListener(e) {
+    switch (e.data.status) {
+      case 'OBLog':
+        var typeLog = e.data.typeLog;
+        if (typeLog === 'info') {
+          OB.info(e.data.message);
+        }
+        if (typeLog === 'error') {
+          OB.error(e.data.message);
+        }
+        if (typeLog === 'warn') {
+          OB.warn(e.data.message);
+        }
+        break;
+      case 'beginning':
+        OB.info('[Message in index] Beginning to fetch');
+        OB.MobileApp.model.set('isLoggingIn', true);
+        OB.UTIL.showLoading(true, null, 'OBPOS_LoadingWebPOSApplication');
+        OB.UTIL.currentLoadingStep = 0;
+        OB.UTIL.loadingSteps = e.data.steps;
+        break;
+      case 'success':
+        OB.info('[Message in index] Success: ' + e.data.path);
+        OB.UTIL.completeLoadingStep();
+        OB.UTIL.showLoadingMessage(e.data.path);
+        break;
+      case 'fail':
+        OB.info('[Message in index] Fail: ' + e.data.path);
+        failResource.push(e.data.path);
+        break;
+      case 'end':
+        OB.MobileApp.model.set('isLoggingIn', false);
+        if (failResource.length === 0) {
+          OB.info('[Everything is catched well]');
+          OB.UTIL.localStorage.setItem('manifest', manifest);
+          if (oldManifest !== null) {
+            window.location.reload();
+          } else {
+            OB.UTIL.showLoading(false);
+            successCallback();
+          }
+        } else {
+          OB.UTIL.showLoading(false);
+          errorCallback();
+        }
+        break;
+    }
+  }
+
+  if (navigator.serviceWorker) {
+    // Remove Listeners
+    if (navigator.serviceWorker.OBMessageListener) {
+      navigator.serviceWorker.removeEventListener(
+        'message',
+        navigator.serviceWorker.OBMessageListener
+      );
+    }
+    if (navigator.serviceWorker.OBControllerListener) {
+      navigator.serviceWorker.removeEventListener(
+        'controllerchange',
+        navigator.serviceWorker.OBControllerListener
+      );
+    }
+
+    // Add Listeners
+    navigator.serviceWorker.addEventListener('message', messageEventListener);
+    navigator.serviceWorker.OBMessageListener = messageEventListener;
+    navigator.serviceWorker.ready.then(function() {
+      // Let's see if you have a subscription already
+      // return serviceWorkerRegistration.pushManager.getSubscription();
+      navigator.serviceWorker.addEventListener(
+        'controllerchange',
+        controllerEventListener
+      );
+      navigator.serviceWorker.OBControllerListener = controllerEventListener;
+    });
+  }
+
   fetch(url)
     .then(function(response) {
       if (response.status !== 200) {
@@ -51,7 +133,7 @@
             setManifest = true;
           } else {
             OB.info('[Manifest] Manifest is still up to date');
-            successNoRefreshCallback();
+            successCallback();
           }
         }
       });
@@ -100,69 +182,7 @@
         OB.info(
           "Manifest couldn't be retrieved, but we have valid sources, so offline mode will be enabled."
         );
-        successNoRefreshCallback();
+        successCallback();
       }
     });
-
-  if (navigator.serviceWorker) {
-    navigator.serviceWorker.ready.then(function() {
-      // Let's see if you have a subscription already
-      // return serviceWorkerRegistration.pushManager.getSubscription();
-      navigator.serviceWorker.addEventListener('controllerchange', function(e) {
-        if (setManifest === true) {
-          send_message_to_sw();
-        }
-      });
-    });
-
-    var failResource = [];
-    navigator.serviceWorker.addEventListener('message', function(e) {
-      switch (e.data.status) {
-        case 'OBLog':
-          var typeLog = e.data.typeLog;
-          if (typeLog === 'info') {
-            OB.info(e.data.message);
-          }
-          if (typeLog === 'error') {
-            OB.error(e.data.message);
-          }
-          if (typeLog === 'warn') {
-            OB.warn(e.data.message);
-          }
-          break;
-        case 'beginning':
-          OB.info('[Message in index] Beginning to fetch');
-          OB.MobileApp.model.set('isLoggingIn', true);
-          OB.UTIL.showLoading(true, null, 'OBPOS_LoadingWebPOSApplication');
-          OB.UTIL.currentLoadingStep = 0;
-          OB.UTIL.loadingSteps = e.data.steps;
-          break;
-        case 'success':
-          OB.info('[Message in index] Success: ' + e.data.path);
-          OB.UTIL.completeLoadingStep();
-          OB.UTIL.showLoadingMessage(e.data.path);
-          break;
-        case 'fail':
-          OB.info('[Message in index] Fail: ' + e.data.path);
-          failResource.push(e.data.path);
-          break;
-        case 'end':
-          OB.MobileApp.model.set('isLoggingIn', false);
-          if (failResource.length === 0) {
-            OB.info('[Everything is catched well]');
-            OB.UTIL.localStorage.setItem('manifest', manifest);
-            if (oldManifest !== null) {
-              window.location.reload();
-            } else {
-              OB.UTIL.showLoading(false);
-              successNoRefreshCallback();
-            }
-          } else {
-            OB.UTIL.showLoading(false);
-            errorCallback();
-          }
-          break;
-      }
-    });
-  }
 };
