diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index 63ad5c252a818d236ca6ebad17f1bb226fa85fd6..ebcf31d1cb2ad0d554b5737a10c252c9926fe9e8 100644
--- a/javascript/src/iframe/viamapi-iframe.js
+++ b/javascript/src/iframe/viamapi-iframe.js
@@ -710,25 +710,39 @@ const connection = Penpal.connectToParent({
       });
     },
     logout: async () => {
-      const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
-      if (!authenticationPublicKey || !window.loadedIdentities[authenticationPublicKey]) {
+      try {
+        const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+        if (!authenticationPublicKey || !window.loadedIdentities[authenticationPublicKey]) {
+          return {
+            data: "",
+            code: "400",
+            status: "Identity not loaded"
+          };
+        }
+
+        // Clone headers to be able destroy authentication first.
+        // We need it because clients should be able reload page right after logout invocation and not wait until request completed
+        const headers = {...window.viamApi.getConfig().headers};
+
+        destroyAuthentication();
+
+        const identityLogoutResponse = await executeRestfulFunction(
+          "private",
+          window.viamApi,
+          window.viamApi.identityLogout,
+          {
+            headers
+          }
+        );
+
+        return identityLogoutResponse;
+      } catch (e) {
         return {
           data: "",
           code: "400",
-          status: "Identity not loaded"
+          status: e.message
         };
       }
-
-      const identityLogoutResponse = await executeRestfulFunction(
-        "private",
-        window.viamApi,
-        window.viamApi.identityLogout,
-        null
-      );
-
-      destroyAuthentication();
-
-      return identityLogoutResponse;
     },
     identityRestoreAccess(restoreAccessIdentity, identificator) {
       return new Penpal.Promise(result => {
@@ -1272,80 +1286,23 @@ connection.promise.then(parent => {
     }
   }, 50);
 
-  setInterval(async () => {
-    if (window.currentlyLoadedIdentity && !anynomousDeviceKeyEventsProcessing && !window.currentlyAuthenticatedIdentity) {
-      anynomousDeviceKeyEventsProcessing = true;
-      try {
-        const executeResult = await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, null, "devicekey");
-        if(executeResult.code === "200") {
-          const eventsLen = executeResult.data.length;
-          let changedMaxDeviceKeyAnonymousEventTime = false;
-          for (let i = 0; i < eventsLen; i++) {
-            const event = executeResult.data[i];
-            switch (event.type) {
-              case "DeviceConfirmed" : {
-                await setIdentityInLocalStorage(window.currentlyLoadedIdentity);
-                parent.onEvent(event);
-                break;
-              }
-
-              case "QRCodeUpdated" : {
-                const actionID = event["actionID"];
-                const QrCode = event["payloads"][1];
-
-                const eventCopy = JSON.parse(JSON.stringify(event));
-
-                QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
-                  eventCopy["payloads"].push(url);
-                  parent.onEvent(eventCopy);
-                });
-                break;
-              }
-
-              case "KeyDeleted" : {
-                const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
-                clearPinCodeTtl(authenticationPublicKey);
-                localStorage.removeItem("uuid");
-                localStorage.removeItem("token");
-                localStorage.removeItem("authenticatedIdentity");
-                delete window.loadedIdentities[authenticationPublicKey];
-                window.currentlyLoadedIdentity = null;
-                window.currentlyAuthenticatedIdentity = null;
-                window.lastTimeGetProfile = 0;
-
-                destroyIdentityFromLocalStorage(authenticationPublicKey);
-                break;
-              }
-
-              default : {
-                parent.onEvent(event);
-              }
+  const getNewEventsWithoutSession = async () => {
+    anynomousDeviceKeyEventsProcessing = true;
+    try {
+      const executeResult = await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, null, "devicekey");
+      if(executeResult.code === "200") {
+        const eventsLen = executeResult.data.length;
+        let changedMaxDeviceKeyAnonymousEventTime = false;
+        for (let i = 0; i < eventsLen; i++) {
+          const event = executeResult.data[i];
+          switch (event.type) {
+            case "DeviceConfirmed" : {
+              await setIdentityInLocalStorage(window.currentlyLoadedIdentity);
+              parent.onEvent(event);
+              break;
             }
-            changedMaxDeviceKeyAnonymousEventTime = true;
-            maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp);
-          }
-
-          if(changedMaxDeviceKeyAnonymousEventTime) {
-            await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession,
-              null, "devicekey", maxDeviceKeyAnonymousEventTime.toString());
-          }
-        }
-      } catch (e) {
-        console.warn(e);
-      }
-      anynomousDeviceKeyEventsProcessing = false;
-    }
 
-    if (window.currentlyAuthenticatedIdentity != null && eventsDeviceEventsProcessing === false) {
-      eventsDeviceEventsProcessing = true;
-      try {
-        const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "devicekey");
-        if (executeResult.code === "200") {
-          const eventsLen = executeResult.data.length;
-          const changedMaxDeviceKeyEventTime = false;
-          for (let i = 0; i < eventsLen; i++) {
-            const event = executeResult.data[i];
-            if (event.type === "QRCodeUpdated") {
+            case "QRCodeUpdated" : {
               const actionID = event["actionID"];
               const QrCode = event["payloads"][1];
 
@@ -1355,59 +1312,126 @@ connection.promise.then(parent => {
                 eventCopy["payloads"].push(url);
                 parent.onEvent(eventCopy);
               });
-            } else {
+              break;
+            }
+
+            case "KeyDeleted" : {
+              const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+              clearPinCodeTtl(authenticationPublicKey);
+              localStorage.removeItem("uuid");
+              localStorage.removeItem("token");
+              localStorage.removeItem("authenticatedIdentity");
+              delete window.loadedIdentities[authenticationPublicKey];
+              window.currentlyLoadedIdentity = null;
+              window.currentlyAuthenticatedIdentity = null;
+              window.lastTimeGetProfile = 0;
+
+              destroyIdentityFromLocalStorage(authenticationPublicKey);
+              break;
+            }
+
+            default : {
               parent.onEvent(event);
             }
-            maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp);
           }
-          if(changedMaxDeviceKeyEventTime) {
-            await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "devicekey",
-              maxDeviceKeyEventTime.toString());
+          changedMaxDeviceKeyAnonymousEventTime = true;
+          maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp);
+        }
+
+        if(changedMaxDeviceKeyAnonymousEventTime) {
+          await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession,
+            null, "devicekey", maxDeviceKeyAnonymousEventTime.toString());
+        }
+      }
+    } catch (e) {
+      console.warn(e);
+    }
+    anynomousDeviceKeyEventsProcessing = false;
+  };
+
+  const getNewDeviceEvents = async () => {
+    eventsDeviceEventsProcessing = true;
+    try {
+      const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "devicekey");
+      if (executeResult.code === "200") {
+        const eventsLen = executeResult.data.length;
+        const changedMaxDeviceKeyEventTime = false;
+        for (let i = 0; i < eventsLen; i++) {
+          const event = executeResult.data[i];
+          if (event.type === "QRCodeUpdated") {
+            const actionID = event["actionID"];
+            const QrCode = event["payloads"][1];
+
+            const eventCopy = JSON.parse(JSON.stringify(event));
+
+            QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
+              eventCopy["payloads"].push(url);
+              parent.onEvent(eventCopy);
+            });
+          } else {
+            parent.onEvent(event);
           }
+          maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp);
+        }
+        if(changedMaxDeviceKeyEventTime) {
+          await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "devicekey",
+            maxDeviceKeyEventTime.toString());
         }
-      } catch (e) {
-        console.warn(e);
       }
-      eventsDeviceEventsProcessing = false;
+    } catch (e) {
+      console.warn(e);
     }
+    eventsDeviceEventsProcessing = false;
+  };
 
-    if (window.currentlyAuthenticatedIdentity != null && eventsEntityEventsProcessing === false) {
-      eventsEntityEventsProcessing = true;
-      try {
-        const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "entity");
-
-        if (executeResult.code === "200") {
-          const eventsLen = executeResult.data.length;
-          let changedMaxEntityEventTime = false;
-          for (let i = 0; i < eventsLen; i++) {
-            const event = executeResult.data[i];
-            if (event.type === "QRCodeUpdated") {
-              const actionID = event["actionID"];
-              const QrCode = event["payloads"][1];
+  const getNewEntityEvents = async () => {
+    eventsEntityEventsProcessing = true;
+    try {
+      const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "entity");
 
-              const eventCopy = JSON.parse(JSON.stringify(event));
+      if (executeResult.code === "200") {
+        const eventsLen = executeResult.data.length;
+        let changedMaxEntityEventTime = false;
+        for (let i = 0; i < eventsLen; i++) {
+          const event = executeResult.data[i];
+          if (event.type === "QRCodeUpdated") {
+            const actionID = event["actionID"];
+            const QrCode = event["payloads"][1];
 
-              QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
-                eventCopy["payloads"].push(url);
-                parent.onEvent(eventCopy);
-              });
+            const eventCopy = JSON.parse(JSON.stringify(event));
 
-              continue;
-            }
+            QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
+              eventCopy["payloads"].push(url);
+              parent.onEvent(eventCopy);
+            });
 
-            parent.onEvent(event);
-            changedMaxEntityEventTime = true;
-            maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp);
-          }
-          if(changedMaxEntityEventTime) {
-            await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "entity",
-              maxEntityEventTime.toString());
+            continue;
           }
+
+          parent.onEvent(event);
+          changedMaxEntityEventTime = true;
+          maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp);
+        }
+        if(changedMaxEntityEventTime) {
+          await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "entity",
+            maxEntityEventTime.toString());
         }
-      } catch (e) {
-        console.warn(e);
       }
-      eventsEntityEventsProcessing = false;
+    } catch (e) {
+      console.warn(e);
+    }
+    eventsEntityEventsProcessing = false;
+  }
+
+  setInterval(() => {
+    if (window.currentlyLoadedIdentity && !anynomousDeviceKeyEventsProcessing && !window.currentlyAuthenticatedIdentity) {
+      getNewEventsWithoutSession();
+    }
+
+    if (window.currentlyAuthenticatedIdentity) {
+      // These functions has to be executed at the same time.
+      !eventsDeviceEventsProcessing && getNewDeviceEvents();
+      !eventsEntityEventsProcessing && getNewEntityEvents();
     }
   }, 1000);
 });