diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 4c75b8841205a83b06cea80b2e3ae56816e0b194..8e7134f3aea9474b91c9a96b1d50e0193732b6cb 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -17,6 +17,7 @@ var Comment = require('./map/data/Comment');
 var Configuration = require('./Configuration');
 var Drug = require('./map/data/Drug');
 var ConfigurationType = require('./ConfigurationType');
+var Functions = require('./Functions');
 var IdentifiedElement = require('./map/data/IdentifiedElement');
 var InvalidCredentialsError = require('./InvalidCredentialsError');
 var LayoutAlias = require('./map/data/LayoutAlias');
@@ -129,6 +130,20 @@ ServerConnector.sendGetRequest = function (url, description) {
   });
 };
 
+function isSessionExpiredError(error) {
+  if (error instanceof NetworkError) {
+    if (error.statusCode === HttpStatus.FORBIDDEN) {
+      if (error.content.indexOf('"reason":"Invalid token"') >= 0) {
+        return true;
+      }
+      if (error.content.indexOf('"reason":"Missing cookie') >= 0) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
 ServerConnector.sendRequest = function (params) {
   var self = this;
   if (arguments.length > 1) {
@@ -154,17 +169,21 @@ ServerConnector.sendRequest = function (params) {
   }).then(function () {
     return content;
   }, function (error) {
-    if (error instanceof NetworkError) {
-      if (error.statusCode === HttpStatus.FORBIDDEN && error.content.indexOf('"reason":"Invalid token"') >= 0) {
-        self.getSessionData().setToken(undefined);
-        if (self.getSessionData().getLogin() === "anonymous") {
+    var promise = Promise.resolve();
+    if (isSessionExpiredError(error)) {
+      self.getSessionData().setToken(undefined);
+      var login = self.getSessionData().getLogin();
+      promise = self.login().then(function () {
+        if (login === "anonymous" || login === undefined) {
           window.location.reload(false);
         } else {
           window.location.href = ServerConnector.getServerBaseUrl() + "login.xhtml?from=" + encodeURI(window.location.href);
         }
-      }
+      });
     }
-    return Promise.reject(error);
+    return promise.then(function () {
+      return Promise.reject(error);
+    });
   });
 
 };
@@ -219,30 +238,6 @@ ServerConnector.sendPatchRequest = function (url, json) {
   });
 };
 
-ServerConnector.getToken = function () {
-  var self = this;
-
-  var login = self.getSessionData(null).getLogin();
-  var token = self.getSessionData(null).getToken();
-  if (token === undefined || login === undefined) {
-    return self.login();
-  } else {
-    // if the project is not initialized then check if we can download data
-    // using current token
-    if (self.getSessionData().getProject() === null) {
-      return self.getConfiguration().then(function () {
-        return token;
-        // if there was an error accessing configuration it means our token is
-        // invalid
-      }, function () {
-        return self.login();
-      });
-    } else {
-      return Promise.resolve(token);
-    }
-  }
-};
-
 ServerConnector.getApiBaseUrl = function () {
   return this.getServerBaseUrl() + "/api/";
 };
@@ -1334,11 +1329,12 @@ ServerConnector.getComments = function (params) {
 
 ServerConnector.getSessionData = function (project) {
   if (this._sessionData === undefined) {
-    this._sessionData = new SessionData(project);
+    this._sessionData = new SessionData(null);
   }
   if (project !== undefined && this._sessionData.getProject() === null) {
     this._sessionData.setProject(project);
   }
+
   return this._sessionData;
 };
 
@@ -1364,6 +1360,14 @@ ServerConnector.getClosestElementsByCoordinates = function (params) {
   });
 };
 
+ServerConnector.createSession = function () {
+  var self = this;
+  return self.getConfiguration().catch(function (error) {
+    if (isSessionExpiredError(error)) {
+      return self.login();
+    }
+  });
+};
 ServerConnector.login = function (login, password) {
   var self = this;
   var params = {};
diff --git a/frontend-js/src/main/js/SessionData.js b/frontend-js/src/main/js/SessionData.js
index 08cc58aaa753c729c12878c1515258e71d5c1925..28c7bdce553add851cf665cfdd028c2bd919c528 100644
--- a/frontend-js/src/main/js/SessionData.js
+++ b/frontend-js/src/main/js/SessionData.js
@@ -159,6 +159,7 @@ SessionData.prototype.setToken = function(token) {
 SessionData.prototype.getToken = function() {
   var key = SessionObjectType.TOKEN;
   var value = Cookies.get(key);
+  Cookies.set('name', 'value', { expires: 7, path: '' });
   return value;
 };
 
diff --git a/frontend-js/src/main/js/gui/leftPanel/ProjectInfoPanel.js b/frontend-js/src/main/js/gui/leftPanel/ProjectInfoPanel.js
index 357c3560f4a05e697db7c9b15b2cf8f4fb0f9eb2..a9501998f43888bf02af34a9c3a303b9e3f08736 100644
--- a/frontend-js/src/main/js/gui/leftPanel/ProjectInfoPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/ProjectInfoPanel.js
@@ -153,12 +153,6 @@ ProjectInfoPanel.prototype._createInfoPanelGui = function () {
     type: "a",
     href: ServerConnector.getServerBaseUrl() + "/export.xhtml?id=" + projectId,
     content: '<i class="fa fa-mail-forward">&nbsp;EXPORT',
-    onclick: function () {
-      //TODO session expired hack (it should be done on the export.xhtml web page)
-      if (ServerConnector.getSessionData().getToken() === undefined) {
-        exportButton.href = ServerConnector.getServerBaseUrl() + "login.xhtml?from=" + encodeURI(exportButton.href);
-      }
-    },
     xss: false
   });
   liElement = Functions.createElement({
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index 09387a4e6cb4e06457ed946a9ce0dc1b3a541989..dd99ee55d21751b8f7f46e5f16197e815f022947 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -243,7 +243,8 @@ function create(params) {
     + "<img src='resources/images/icons/ajax-loader.gif'/>" + "</div>";
 
   // make sure that we are logged in
-  return ServerConnector.getToken().then(function () {
+  // make sure that we are logged in
+  return ServerConnector.createSession().then(function () {
     return ServerConnector.getConfiguration();
   }).then(function (configuration) {
     params.setConfiguration(configuration);
@@ -505,9 +506,10 @@ function createLogin(params) {
     params = new CustomMapOptions(params);
   }
   initGlobals(params);
-  return ServerConnector.getToken().then(function () {
+  // make sure that we are logged in
+  return ServerConnector.createSession().then(function () {
     return ServerConnector.getConfiguration();
-  }).then(function (footer) {
+  }).then(function (configuration) {
     var loginDiv = createLoginDiv(params);
     params.getElement().appendChild(loginDiv);
     return createFooter(params);
@@ -529,9 +531,7 @@ function createExport(params) {
 
   var result;
   // make sure that we are logged in
-  return ServerConnector.getToken().then(function () {
-    return ServerConnector.getConfiguration();
-  }).then(function (configuration) {
+  return ServerConnector.getConfiguration().then(function (configuration) {
     params.setConfiguration(configuration);
     return getProject(params);
   }).then(function (project) {
@@ -559,7 +559,7 @@ function createAdmin(params) {
 
   var result;
   // make sure that we are logged in
-  return ServerConnector.getToken().then(function () {
+  return ServerConnector.createSession().then(function () {
     return ServerConnector.getConfiguration();
   }).then(function (configuration) {
     params.setConfiguration(configuration);
diff --git a/frontend-js/src/test/js/ServerConnector-test.js b/frontend-js/src/test/js/ServerConnector-test.js
index 039de8876b17aee44d826adeda1dbada2b59b467..868e4997c6ffc71a55899833745f5b093231509a 100644
--- a/frontend-js/src/test/js/ServerConnector-test.js
+++ b/frontend-js/src/test/js/ServerConnector-test.js
@@ -227,19 +227,6 @@ describe('ServerConnector', function () {
     });
   });
 
-  it('getToken', function () {
-    ServerConnector.getSessionData(null).setToken(undefined);
-    var originalFun = ServerConnector.login;
-    ServerConnector.login = function () {
-      return Promise.resolve("TOKEN");
-    };
-    return ServerConnector.getToken().then(function (token) {
-      assert.ok(token !== undefined);
-    }).finally(function () {
-      ServerConnector.login = originalFun;
-    });
-  });
-
   it('getModelDownloadUrl', function () {
     return ServerConnector.getModelDownloadUrl({
       backgroundOverlayId: "cv14081"