diff --git a/frontend-js/src/main/js/gui/ContextMenu.js b/frontend-js/src/main/js/gui/ContextMenu.js
index c45f45e80b007f0be4085871d3fa00c1079d94b3..80d2ed8064b8ea7e2b6680b56392eddb2bd4485e 100644
--- a/frontend-js/src/main/js/gui/ContextMenu.js
+++ b/frontend-js/src/main/js/gui/ContextMenu.js
@@ -79,9 +79,17 @@ ContextMenu.prototype.hide = function() {
   $(this.getElement()).hide();
 };
 
+function extractDataOverlayIds(dataOverlays) {
+  var ids = [];
+  for (var i = 0; i < dataOverlays.length; i++) {
+    ids.push(dataOverlays[i].getId());
+  }
+  return ids;
+}
+
 ContextMenu.prototype.createExportAsImageSubmenu = function() {
   var self = this;
-  return ServerConnector.getImageConverters().then(function(converters){
+  return ServerConnector.getImageConverters().then(function(converters) {
     var li = Functions.createElement({
       type : "li"
     });
@@ -92,18 +100,21 @@ ContextMenu.prototype.createExportAsImageSubmenu = function() {
     });
 
     var map = self.getMap();
-    converters.forEach(function(converter){
-      submenu.addOption(converter.name, function(){
-        return ServerConnector.getImageDownloadUrl({
-          polygonString: map.getSelectedPolygon(),
-          modelId: map.getActiveSubmapId(),
-          handlerClass: converter.handler,
-          backgroundOverlayId: map.getGoogleMap().getMapTypeId(),
-          zoomLevel:map. getGoogleMap().getZoom(),
-          overlayIds: map.getSelectedLayouts(),
-        }).then(function(url){
+    converters.forEach(function(converter) {
+      submenu.addOption(converter.name, function() {
+        return map.getVisibleDataOverlays().then(function(visibleDataOverlays) {
+
+          return ServerConnector.getImageDownloadUrl({
+            polygonString : map.getSelectedPolygon(),
+            modelId : map.getActiveSubmapId(),
+            handlerClass : converter.handler,
+            backgroundOverlayId : map.getGoogleMap().getMapTypeId(),
+            zoomLevel : map.getGoogleMap().getZoom(),
+            overlayIds : extractDataOverlayIds(visibleDataOverlays),
+          });
+        }).then(function(url) {
           return self.downloadFile(url);
-        }).catch(GuiConnector.alert);          
+        }).then(null, GuiConnector.alert);
       });
     });
     return submenu;
@@ -112,7 +123,7 @@ ContextMenu.prototype.createExportAsImageSubmenu = function() {
 
 ContextMenu.prototype.createExportAsModelSubmenu = function() {
   var self = this;
-  return ServerConnector.getModelConverters().then(function(converters){
+  return ServerConnector.getModelConverters().then(function(converters) {
     var li = Functions.createElement({
       type : "li"
     });
@@ -123,18 +134,20 @@ ContextMenu.prototype.createExportAsModelSubmenu = function() {
     });
 
     var map = self.getMap();
-    converters.forEach(function(converter){
-      submenu.addOption(converter.name, function(){
-        return ServerConnector.getModelDownloadUrl({
-          polygonString: map.getSelectedPolygon(),
-          modelId: map.getActiveSubmapId(),
-          handlerClass: converter.handler,
-          backgroundOverlayId: map.getGoogleMap().getMapTypeId(),
-          zoomLevel:map. getGoogleMap().getZoom(),
-          overlayIds: map.getSelectedLayouts(),
-        }).then(function(url){
+    converters.forEach(function(converter) {
+      submenu.addOption(converter.name, function() {
+        return map.getVisibleDataOverlays().then(function(visibleDataOverlays) {
+          return ServerConnector.getModelDownloadUrl({
+            polygonString : map.getSelectedPolygon(),
+            modelId : map.getActiveSubmapId(),
+            handlerClass : converter.handler,
+            backgroundOverlayId : map.getGoogleMap().getMapTypeId(),
+            zoomLevel : map.getGoogleMap().getZoom(),
+            overlayIds : extractDataOverlayIds(visibleDataOverlays),
+          });
+        }).then(function(url) {
           return self.downloadFile(url);
-        }).catch(GuiConnector.alert);          
+        }).then(null, GuiConnector.alert);
       });
     });
     return submenu;
diff --git a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
index 8a914feb625fcbd0f8ae862c47a7339e1de7ac90..3af19f332ae04132266da0066cba0c169101bd65 100644
--- a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
@@ -237,20 +237,22 @@ OverlayPanel.prototype.refresh = function() {
   var user = null;
 
   var overlayTypes = [];
+  var selectedOverlay = [];
 
   return ServerConnector.getOverlayTypes().then(function(types) {
     overlayTypes = types;
     return ServerConnector.getLoggedUser();
   }).then(function(loggedUser) {
     user = loggedUser;
+    return self.getMap().getVisibleDataOverlays();
+  }).then(function(visibleDataOverlays) {
+    for (var j = 0; j < visibleDataOverlays.length; j++) {
+      selectedOverlay[visibleDataOverlays[j].getId()] = true;
+    }
+    
     return ServerConnector.getOverlays();
   }).then(function(customOverlays) {
-    var selectedOverlayIds = self.getMap().getSelectedLayouts();
-    var selectedOverlay = [];
 
-    for (var j = 0; j < selectedOverlayIds.length; j++) {
-      selectedOverlay[selectedOverlayIds[j]] = true;
-    }
 
     var id = self.getMap().getGoogleMap().getMapTypeId().substring(2);
     selectedOverlay[id] = true;
diff --git a/frontend-js/src/main/js/map/AbstractCustomMap.js b/frontend-js/src/main/js/map/AbstractCustomMap.js
index b3f7cd08c55e97ec965287f78834e9d9ee58d141..6c6e637c90a09c43ddcc8261222a026ff0b6b1d9 100644
--- a/frontend-js/src/main/js/map/AbstractCustomMap.js
+++ b/frontend-js/src/main/js/map/AbstractCustomMap.js
@@ -665,15 +665,11 @@ AbstractCustomMap.prototype._openInfoWindowForAlias = function(aliasId) {
  *          {@link Alias} in all currently visualized layouts
  */
 AbstractCustomMap.prototype.getAliasVisibleLayoutsData = function(aliasId) {
-  var layoutIds = this.getTopMap().getSelectedLayouts();
-  var promises = [];
-  for (var i = 0; i < layoutIds.length; i++) {
-    promises.push(this.getModel().getLayoutDataById(layoutIds[i]));
-  }
-  return Promise.all(promises).then(function(layouts) {
+  var self = this;
+  return self.getTopMap().getVisibleDataOverlays().then(function(visibleDataOverlays) {
     var result = [];
-    for (var i = 0; i < layouts.length; i++) {
-      var layout = layouts[i];
+    for (var i = 0; i < visibleDataOverlays.length; i++) {
+      var layout = visibleDataOverlays[i];
       if (layout !== null && layout !== undefined) {
         result.push(layout.getFullAliasById(aliasId));
       } else {
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 282aea9044b3e8cba58ce42ba8de39ac1d961694..9759aea82818fdce466b28a226784450d2ac9c3f 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -226,27 +226,34 @@ CustomMap.prototype.openDataOverlay = function(param) {
   if (index === null) {
     throw new Error("You have no privileges for selected overlay");
   } else {
-    if (overlayToOpen.getInputDataAvailable()) {
-      if (self._selectedOverlays[identifier] === true) {
-        logger.warn("Overlay " + identifier + " already selected");
-        return Promise.resolve();
+    return overlayToOpen.init().then(function() {
+      if (overlayToOpen.getInputDataAvailable()) {
+        if (self._selectedOverlays[identifier] === true) {
+          logger.warn("Overlay " + identifier + " already selected");
+          return Promise.resolve();
+        } else {
+          self._selectedOverlays[identifier] = true;
+          return self.getVisibleDataOverlays().then(function(visibleDataOverlays) {
+            var ids = [];
+            for (var i = 0; i < visibleDataOverlays.length; i++) {
+              ids.push(visibleDataOverlays[i].getId());
+            }
+            ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(ids);
+            return self.refreshSelectedLayouts();
+          });
+
+        }
       } else {
-        self._selectedOverlays[identifier] = true;
-        ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(self.getSelectedLayouts());
-        return self.getModel().initLayoutDataByLayoutId(identifier).then(function() {
-          return self.refreshSelectedLayouts();
-        });
-      }
-    } else {
-      this.getGoogleMap().setMapTypeId(identifier.toString());
+        self.getGoogleMap().setMapTypeId(identifier.toString());
 
-      var submaps = self.getSubmaps();
-      for (var i = 0; i < submaps.length; i++) {
-        var submap = submaps[i];
-        submap.openDataOverlay(submap.getModel().getLayouts()[index].getId());
+        var submaps = self.getSubmaps();
+        for (var i = 0; i < submaps.length; i++) {
+          var submap = submaps[i];
+          submap.openDataOverlay(submap.getModel().getLayouts()[index].getId());
+        }
+        return Promise.resolve();
       }
-      return Promise.resolve();
-    }
+    });
   }
 };
 
@@ -419,23 +426,23 @@ CustomMap.prototype.openSubmap = function(id) {
     submap.open(dialogDiv);
 
     // we have to perform it on top map, because on submaps id is different
-    this.openDataOverlay(this.getGoogleMap().getMapTypeId());
-
-    // now we have to visualize layouts
-    var layouts = [];
-
-    // get list of layouts
-    for ( var key in this._selectedOverlays) {
-      if (this._selectedOverlays.hasOwnProperty(key) && this._selectedOverlays[key] === true) {
-        layouts.push(key);
+    return this.openDataOverlay(self.getGoogleMap().getMapTypeId()).then(function() {
+      // now we have to visualize layouts
+      var layouts = [];
+
+      // get list of layouts
+      for ( var key in self._selectedOverlays) {
+        if (self._selectedOverlays.hasOwnProperty(key) && self._selectedOverlays[key] === true) {
+          layouts.push(key);
+        }
       }
-    }
 
-    // show layouts that should be visualized (resize or show them)
-    for (var i = 0; i < layouts.length; i++) {
-      var layoutId = layouts[i];
-      submap._showSelectedLayout(layoutId, i, layouts.length);
-    }
+      // show layouts that should be visualized (resize or show them)
+      for (var i = 0; i < layouts.length; i++) {
+        var layoutId = layouts[i];
+        submap._showSelectedLayout(layoutId, i, layouts.length);
+      }
+    });
   }
 
 };
@@ -464,7 +471,6 @@ CustomMap.prototype.customizeGoogleMapView = function(div) {
   }
 };
 
-
 /**
  * Creates listeners for google.maps.Map object that will actualize the data in
  * user session.
@@ -525,24 +531,6 @@ CustomMap.prototype.removeSelection = function() {
   }
 };
 
-/**
- * Returns list of layouts that are selected and visualized by javascript.
- * 
- * @return array with a list of selected layotus
- * 
- */
-CustomMap.prototype.getSelectedLayouts = function() {
-  var layouts = [];
-
-  // get list of layouts
-  for ( var key in this._selectedOverlays) {
-    if (this._selectedOverlays.hasOwnProperty(key) && this._selectedOverlays[key] === true) {
-      layouts.push(key);
-    }
-  }
-  return layouts;
-};
-
 /**
  * Removes layout from visualization.
  * 
@@ -551,14 +539,24 @@ CustomMap.prototype.getSelectedLayouts = function() {
  * 
  */
 CustomMap.prototype.removeSelectedLayout = function(identifier) {
+  var self = this;
   logger.debug("Removing layout: " + identifier);
 
   if (this._selectedOverlays[identifier] !== true) {
     logger.warn("Overlay " + identifier + " is not selected");
+    return Promise.resolve();
   } else {
-    this._selectedOverlays[identifier] = false;
-    this.refreshSelectedLayouts();
-    ServerConnector.getSessionData(this.getProject()).setVisibleOverlays(this.getSelectedLayouts());
+    self._selectedOverlays[identifier] = false;
+    return self.refreshSelectedLayouts().then(function() {
+      return self.getVisibleDataOverlays();
+    }).then(function(visibleDataOverlays) {
+      var ids = [];
+      for (var i = 0; i < visibleDataOverlays.length; i++) {
+        ids.push(visibleDataOverlays[i].getId());
+      }
+      ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(ids);
+      return self.refreshSelectedLayouts();
+    });
   }
 };
 
@@ -568,28 +566,29 @@ CustomMap.prototype.removeSelectedLayout = function(identifier) {
 CustomMap.prototype.refreshSelectedLayouts = function() {
   logger.debug("Refreshing layouts");
   var self = this;
-  var layouts = self.getSelectedLayouts();
-  // show layouts that should be visualized (resize or show them)
-  var promises = [];
-  for (var i = 0; i < layouts.length; i++) {
-    var layoutId = layouts[i];
-    if (self.layoutContainsOverlays(layoutId)) {
-      // resize element on the map
-      promises.push(self.resizeSelectedLayout(layoutId, i, layouts.length));
-    } else {
-      promises.push(self.showSelectedLayout(layoutId, i, layouts.length));
+  return self.getVisibleDataOverlays().then(function(visibleDataOverlays) {
+    // show layouts that should be visualized (resize or show them)
+    var promises = [];
+    for (var i = 0; i < visibleDataOverlays.length; i++) {
+      var layoutId = visibleDataOverlays[i].getId();
+      if (self.layoutContainsOverlays(layoutId)) {
+        // resize element on the map
+        promises.push(self.resizeSelectedLayout(layoutId, i, visibleDataOverlays.length));
+      } else {
+        promises.push(self.showSelectedLayout(layoutId, i, visibleDataOverlays.length));
+      }
     }
-  }
-  return Promise.all(promises).then(function() {
-    // remove layouts that were
-    for ( var key in self.selectedLayoutOverlays) {
-      if (!self._selectedOverlays.hasOwnProperty(key) || self._selectedOverlays[key] === false) {
-        if (self.layoutContainsOverlays(key)) {
-          self.hideSelectedLayout(key);
+    return Promise.all(promises).then(function() {
+      // remove layouts that were
+      for ( var key in self.selectedLayoutOverlays) {
+        if (!self._selectedOverlays.hasOwnProperty(key) || self._selectedOverlays[key] === false) {
+          if (self.layoutContainsOverlays(key)) {
+            self.hideSelectedLayout(key);
+          }
         }
       }
-    }
-    return self.refreshInfoWindows();
+      return self.refreshInfoWindows();
+    });
   });
 };
 
@@ -1277,9 +1276,8 @@ CustomMap.prototype.getVisibleDataOverlays = function() {
       dataOverlayPromises.push(this.getModel().getLayoutDataById(key));
     }
   }
-  
+
   return Promise.all(dataOverlayPromises);
 };
 
-
 module.exports = CustomMap;
diff --git a/frontend-js/src/main/js/map/data/LayoutData.js b/frontend-js/src/main/js/map/data/LayoutData.js
index 3275fc9312ae5ad3f78804ef6c3e5fee79a8f0e6..a31227f460dcbf779f5ee24a5c5a3778011a32f4 100644
--- a/frontend-js/src/main/js/map/data/LayoutData.js
+++ b/frontend-js/src/main/js/map/data/LayoutData.js
@@ -24,6 +24,9 @@ function LayoutData(layoutId, name) {
     this.setDescription(object.description);
     this.setCreator(object.creator);
     this.setInputDataAvailable(object.inputDataAvailable);
+    if (!this.getInputDataAvailable()) {
+      this.setInitialized(true);
+    }
   } else {
     // default two param call
     this.setId(layoutId);
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index fa2ccf0a065bdfe6f8b8d4deff2489f412a20300..65800e99dc8b194e995e9580ace6446ac6cde5c3 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -168,8 +168,8 @@ function getOverlayByName(customMap, dbOverlayName) {
 }
 function createResult(customMap) {
   return {
-    getSelectedDataOverlays : function() {
-      return customMap.getSelectedLayouts();
+    getVisibleDataOverlays : function() {
+      return customMap.getVisibleDataOverlays();
     },
     addListener : function(dbOverlayName, type, callback) {
       var dbOverlay = getOverlayByName(customMap, dbOverlayName);
diff --git a/frontend-js/src/test/js/gui/SelectionContextMentu-test.js b/frontend-js/src/test/js/gui/SelectionContextMentu-test.js
index a0101d9c5f206ec06b379df5a879f9aa1f3a2891..44e6562fdd79be2ef14738070cc9d8da6cd19ec7 100644
--- a/frontend-js/src/test/js/gui/SelectionContextMentu-test.js
+++ b/frontend-js/src/test/js/gui/SelectionContextMentu-test.js
@@ -50,4 +50,24 @@ describe('SelectionContextMenu', function() {
       map.destroy();
     });
   });
+  
+  it('download cell designer file', function() {
+    var map;
+    return ServerConnector.getProject().then(function(project) {
+      map = helper.createCustomMap(project);
+
+      var contextMenu = new SelectionContextMenu({
+        element : testDiv,
+        customMap : map
+      });
+      return contextMenu.init();
+    }).then(function(){
+      map.setActiveSubmapId(map.getProject().getModel().getId());
+      map.setActiveSubmapClickCoordinates(new google.maps.Point(2, 12));
+      var handler = $($("a:contains('CellDesigner')", $(testDiv))[0]).data("handler");
+      return handler();
+    }).then(function() {
+      map.destroy();
+    });
+  });
 });
diff --git a/frontend-js/src/test/js/map/CustomMap-test.js b/frontend-js/src/test/js/map/CustomMap-test.js
index 90e95a14fb85acc77823dfe7ea14d5cbcb0926e5..02bea72b160a0fc934babb204b675aff56e99a62 100644
--- a/frontend-js/src/test/js/map/CustomMap-test.js
+++ b/frontend-js/src/test/js/map/CustomMap-test.js
@@ -117,10 +117,12 @@ describe('CustomMap', function() {
     var map = helper.createCustomMap();
     var layout = helper.createLayout();
     layout.setInitialized(true);
+    layout.setInputDataAvailable(true);
     map.getModel().addLayout(layout);
 
     return map.openDataOverlay(layout.getId()).then(function() {
-      map.removeSelectedLayout(layout.getId());
+      return map.removeSelectedLayout(layout.getId());
+    }).then(function() {
       var vLayouts = ServerConnector.getSessionData(map.getProject()).getVisibleOverlays();
       assert.equal(0, vLayouts.length);
     });
@@ -173,16 +175,19 @@ describe('CustomMap', function() {
     var projectId = "complex_model_with_submaps";
     helper.setUrl("http://test/?id=" + projectId);
     GuiConnector.getParams["id"] = projectId;
+    var customMap;
+    var emptySubmodelId = 16730;
+    var filledSubmodelId = 16731;
+    var overlayId = 18083;
+
     return ServerConnector.getProject(projectId).then(function(project) {
       var options = helper.createCustomMapOptions(project);
-      var customMap = new CustomMap(options);
-      var overlayId = 18083;
-      
-      var emptySubmodelId = 16730; 
-      var filledSubmodelId = 16731; 
-      
-      customMap.openSubmap(emptySubmodelId);
-      customMap.openSubmap(filledSubmodelId);
+      customMap = new CustomMap(options);
+
+      return customMap.openSubmap(emptySubmodelId);
+    }).then(function() {
+      return customMap.openSubmap(filledSubmodelId);
+    }).then(function() {
 
       var emptySubmap = customMap.getSubmapById(emptySubmodelId);
       var filledSubmap = customMap.getSubmapById(filledSubmodelId);
diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js
index 8f3f9bb82c881d4542c59b02e8f164b0108abb69..dd7ba497f36b0b331fd82d0bb627d8f63dff67ad 100644
--- a/frontend-js/src/test/js/minerva-test.js
+++ b/frontend-js/src/test/js/minerva-test.js
@@ -105,7 +105,10 @@ describe('minerva global', function() {
     return minerva.create(options).then(function(result) {
       assert.ok(result);
       // input file is not available so it's the background
-      assert.equal(result.getSelectedDataOverlays().length, 0);
+      return result.getVisibleDataOverlays();
+    }).then(function(visibleDataOverlays){      
+      // input file is available so it's not the background file but overlay
+      assert.equal(visibleDataOverlays.length, 0);
       assert.equal(ServerConnector.getSessionData(project).getSelectedBackgroundOverlay(), layoutId);
       assert.equal(logger.getWarnings().length, 0);
     });
@@ -146,8 +149,10 @@ describe('minerva global', function() {
 
     return minerva.create(options).then(function(result) {
       assert.ok(result);
+      return result.getVisibleDataOverlays();
+    }).then(function(visibleDataOverlays){      
       // input file is available so it's not the background file but overlay
-      assert.equal(result.getSelectedDataOverlays().length, 1);
+      assert.equal(visibleDataOverlays.length, 1);
       assert.equal(logger.getWarnings().length, 0);
     });
   });