diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 19c3339fd9c9915eb5b8554c578e0d88288d3f06..0943224d38579977b71da030eddf6008ccff4ee9 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -600,7 +600,13 @@ ServerConnector.getProject = function(projectId) {
     return self.getModels(projectId);
   }).then(function(models) {
     project.setModel(models[0]);
-    return self.getOverlays(projectId);
+    return self.getLoggedUser();
+  }).then(function(user) {
+    return self.getOverlays({
+      projectId : projectId,
+      creator : user.getLogin(),
+      publicOverlay : false,
+    });
   }).then(function(overlays) {
     project.getModel().addLayouts(overlays);
     return project;
@@ -726,12 +732,18 @@ ServerConnector.getUser = function(login) {
   });
 };
 
-ServerConnector.getOverlays = function(projectId) {
+ServerConnector.getOverlays = function(params) {
   var self = this;
+  if (params === undefined) {
+    params = {};
+  }
   var queryParams = {};
-  var filterParams = {};
+  var filterParams = {
+    creator : params.creator,
+    publicOverlay : params.publicOverlay,
+  };
   return new Promise(function(resolve, reject) {
-    self.getProjectId(projectId).then(function(result) {
+    self.getProjectId(params.projectId).then(function(result) {
       queryParams.projectId = result;
       return self.sendGetRequest(self.getOverlaysUrl(queryParams, filterParams));
     }).then(function(content) {
diff --git a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
index 750b0204fbffab3b17c7259789963e037479ce4f..f7a8eb9669224ab39afa9003728c8c6bfa8cacf6 100644
--- a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
@@ -284,7 +284,10 @@ OverlayPanel.prototype.refresh = function() {
       selectedOverlay[visibleDataOverlays[j].getId()] = true;
     }
 
-    return ServerConnector.getOverlays();
+    return ServerConnector.getOverlays({
+      publicOverlay : false,
+      creator : user.getLogin(),
+    });
   }).then(
       function(customOverlays) {
 
diff --git a/frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/projects/empty/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/empty/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/projects/empty/overlays/token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/projects/empty/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/projects/sample/overlays/token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/projects/sample/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java
index c2ac91b71fa855a848b67eec50bea82bed307d85..5fdd11869da2bbde31f78499b87c2f1656c58e1a 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java
@@ -41,9 +41,11 @@ public class OverlayController extends BaseController {
 	@RequestMapping(value = "/projects/{projectId}/overlays/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
 	public List<LayoutView> getOverlayList(//
 			@CookieValue(value = Configuration.AUTH_TOKEN) String token, //
-			@PathVariable(value = "projectId") String projectId //
+			@PathVariable(value = "projectId") String projectId, //
+			@RequestParam(value = "creator", defaultValue = "") String creator, //
+			@RequestParam(value = "publicOverlay", defaultValue = "") String publicOverlay //
 	) throws SecurityException, QueryException {
-		return overlayRestImp.getOverlayList(token, projectId);
+		return overlayRestImp.getOverlayList(token, projectId, creator, publicOverlay);
 	}
 
 	@RequestMapping(value = "/projects/{projectId}/overlays/{overlayId}/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java
index aaa01d3ccd8f745d25d4dfaf0106133e7db8842c..b6bc43c0baca458297d1b6eccbf307a531fbb0c3 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java
@@ -51,13 +51,24 @@ public class OverlayRestImpl extends BaseRestImpl {
 	@Autowired
 	private LayoutDao			 layoutDao;
 
-	public List<LayoutView> getOverlayList(String token, String projectId) throws SecurityException, QueryException {
+	public List<LayoutView> getOverlayList(String token, String projectId, String creatorLogin, String publicOverlay) throws SecurityException, QueryException {
 		AuthenticationToken authenticationToken = getUserService().getToken(token);
 		Model model = getModelService().getLastModelByProjectId(projectId, authenticationToken);
 		if (model == null) {
-			throw new QueryException("Project with given id doesn't exist");
+			throw new ObjectNotFoundException("Project with given id doesn't exist");
+		}
+		User creator = null;
+		if (creatorLogin != null && !creatorLogin.isEmpty()) {
+			creator = getUserService().getUserByLogin(creatorLogin);
+			if (creator == null) {
+				throw new ObjectNotFoundException("User with given id doesn't exist: " + creatorLogin);
+			}
+		}
+		Boolean publicData = null;
+		if (publicOverlay != null && !publicOverlay.isEmpty()) {
+			publicData = publicOverlay.equalsIgnoreCase("true");
 		}
-		return layoutService.getCustomLayouts(model, token);
+		return layoutService.getCustomLayouts(model, token, publicData, creator);
 	}
 
 	/**
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
index d59ddfb6dce2be3d1ffebc15e10e1ebd427a7439..a53089ee5c1c49a60528b6a6ec27d873367ebc02 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
@@ -170,14 +170,27 @@ public class LayoutService implements ILayoutService {
 	}
 
 	@Override
-	public List<LayoutView> getCustomLayouts(Model model, User user) {
-		List<LayoutView> result = new ArrayList<LayoutView>();
+	public List<LayoutView> getCustomLayouts(Model model, User user, Boolean publicOverlay, User creator) {
+		List<LayoutView> result = new ArrayList<>();
 		if (model == null || user == null) {
 			return result;
 		}
 		List<Layout> layouts = layoutDao.getLayoutsByModel(model);
 		for (Layout layout : layouts) {
-			if (!layout.isPublicLayout() && layout.getCreator() != null) {
+			boolean toAdd = true;
+			if (creator != null) {
+				if (layout.getCreator() == null) {
+					toAdd = false;
+				} else if (!layout.getCreator().getId().equals(creator.getId())) {
+					toAdd = false;
+				}
+			}
+			if (publicOverlay != null) {
+				if (!publicOverlay.equals(layout.isPublicLayout())) {
+					toAdd = false;
+				}
+			}
+			if (toAdd) {
 				if (userCanViewOverlay(layout, user)) {
 					result.add(layoutViewFactory.create(layout));
 				}
@@ -1034,8 +1047,8 @@ public class LayoutService implements ILayoutService {
 	}
 
 	@Override
-	public List<LayoutView> getCustomLayouts(Model model, String token) throws SecurityException {
-		return this.getCustomLayouts(model, userService.getUserByToken(token));
+	public List<LayoutView> getCustomLayouts(Model model, String token, Boolean publicOverlay, User creator) throws SecurityException {
+		return this.getCustomLayouts(model, userService.getUserByToken(token), publicOverlay, creator);
 	}
 
 	@Override
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ModelService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ModelService.java
index b419e81a7e085027f9f1e1f09fb0aed89b22ebe6..4d7a63ac461d334231ef3677596db8e68046ae0e 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ModelService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ModelService.java
@@ -380,9 +380,9 @@ public class ModelService implements IModelService {
 	public ModelView getModelView(Model model, User user) {
 		ModelView result = modelViewFactory.create(model);
 		if (user != null) {
-			result.setCustomLayouts(layoutService.getCustomLayouts(model, user));
+			result.setCustomLayouts(layoutService.getCustomLayouts(model, user, true, user));
 			for (ModelView view : result.getSubmodels()) {
-				view.setCustomLayouts(layoutService.getCustomLayouts(model.getSubmodelById(view.getIdObject()), user));
+				view.setCustomLayouts(layoutService.getCustomLayouts(model.getSubmodelById(view.getIdObject()), user, true, user));
 			}
 		}
 		return result;
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
index 25fa736447967dcb84d4d2f063ccdb70fe10b25a..bf663ae19f13ded13a04fc934679110cc58af457 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
@@ -568,4 +568,17 @@ public class UserService implements IUserService {
 	public boolean userHasPrivilege(AuthenticationToken token, PrivilegeType type) {
 		return userHasPrivilege(getUserByToken(token), type);
 	}
+
+	@Override
+	public User getUserById(String creatorId, AuthenticationToken authenticationToken) throws SecurityException {
+		User user = getUserByToken(authenticationToken);
+		Integer id = Integer.parseInt(creatorId);
+		if (user.getId().equals(id)) {
+			return user;
+		} else if (userHasPrivilege(authenticationToken, PrivilegeType.USER_MANAGEMENT)) {
+			return getUserById(id);
+		} else {
+			throw new SecurityException("You cannot access data of other users");
+		}
+	}
 }
diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java
index cec9c0ac8c19ff86c1892ca31d24366196f28801..35e662b9231100f39736c4fb8f3d0b55a772d8a5 100644
--- a/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java
@@ -320,7 +320,7 @@ public interface ILayoutService {
 	 *          user who asks for the layouts
 	 * @return list of custom layouts
 	 */
-	List<LayoutView> getCustomLayouts(Model model, User user);
+	List<LayoutView> getCustomLayouts(Model model, User user, Boolean publicOverlay, User creator);
 
 	/**
 	 * Returns list of general publically available layouts.
@@ -521,7 +521,7 @@ public interface ILayoutService {
 	 */
 	void setEmailSender(EmailSender emailSender);
 
-	List<LayoutView> getCustomLayouts(Model model, String token) throws SecurityException;
+	List<LayoutView> getCustomLayouts(Model model, String token, Boolean publicOverlay, User creator) throws SecurityException;
 
 	LayoutView getLayoutById(Model model, int overlayId, AuthenticationToken token) throws SecurityException;
 
diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java
index bc59fb9104b9321272dececad18ec75e053a8afc..ad4c6dd627f37f7dc1e86b21efdad2be1f78c4e5 100644
--- a/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java
@@ -254,4 +254,6 @@ public interface IUserService {
 	void logout(AuthenticationToken token);
 
 	boolean userHasPrivilege(AuthenticationToken token, PrivilegeType addMap);
+
+	User getUserById(String creatorId, AuthenticationToken authenticationToken) throws SecurityException;
 }
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java
index 4978e489de6b27bc3171b316d103588a0ec26fe5..29acf5879ae1750375512eefc988ffbf2453f572 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java
@@ -192,7 +192,7 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 	@Test
 	public void testGetCustomLayouts() throws Exception {
 		try {
-			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user);
+			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertNotNull(layouts);
 			assertEquals(0, layouts.size());
 
@@ -208,24 +208,24 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 			assertNotNull(row);
 			assertNotNull(row.getIdObject());
 
-			layouts = layoutService.getCustomLayouts(model, user);
+			layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertEquals(1, layouts.size());
 
-			layouts = layoutService.getCustomLayouts(model, user2);
+			layouts = layoutService.getCustomLayouts(model, user2, true, user2);
 			assertEquals(0, layouts.size());
 
 			layoutService.addViewPrivilegeToLayout(row, user2);
 
-			layouts = layoutService.getCustomLayouts(model, user2);
+			layouts = layoutService.getCustomLayouts(model, user2, true, user2);
 			assertEquals(1, layouts.size());
 
 			layoutService.dropViewPrivilegeFromLayout(row, user2);
 
-			layouts = layoutService.getCustomLayouts(model, user2);
+			layouts = layoutService.getCustomLayouts(model, user2, true, user2);
 			assertEquals(0, layouts.size());
 
 			// null user shouldn't have acces to custom layouts
-			layouts = layoutService.getCustomLayouts(model, (User) null);
+			layouts = layoutService.getCustomLayouts(model, (User) null,  true, null);
 			assertEquals(0, layouts.size());
 
 			layoutService.removeLayout(row, null);
@@ -265,7 +265,7 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 	@Test
 	public void testUpdateLayout() throws Exception {
 		try {
-			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user);
+			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertNotNull(layouts);
 			assertEquals(0, layouts.size());
 
@@ -278,7 +278,7 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 					user(user);
 			LayoutView row = layoutService.createLayout(params);
 
-			layouts = layoutService.getCustomLayouts(model, user);
+			layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertEquals(1, layouts.size());
 			assertEquals("Test", layouts.get(0).getName());
 
@@ -286,7 +286,7 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 
 			layoutService.updateLayout(row);
 
-			layouts = layoutService.getCustomLayouts(model, user);
+			layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertEquals(1, layouts.size());
 			assertEquals("New name", layouts.get(0).getName());
 
@@ -301,7 +301,7 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 	@Test(timeout = 15000)
 	public void testCreateAsyncLayout() throws Exception {
 		try {
-			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user);
+			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertNotNull(layouts);
 			assertEquals(0, layouts.size());
 
@@ -325,7 +325,7 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 				layoutDao.refresh(layoutDb);
 			} while (layoutDb.getStatus() != LayoutStatus.OK);
 
-			layouts = layoutService.getCustomLayouts(model, user);
+			layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertEquals(1, layouts.size());
 
 			long logCounter2 = logDao.getCount();
@@ -403,7 +403,7 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 	@Test
 	public void testInputDataInLayout() throws Exception {
 		try {
-			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user);
+			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertNotNull(layouts);
 			assertEquals(0, layouts.size());
 
@@ -438,7 +438,7 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 	@Test
 	public void testGetLayoutAliases() throws Exception {
 		try {
-			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user);
+			List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user);
 			assertNotNull(layouts);
 			assertEquals(0, layouts.size());
 
diff --git a/web/src/main/java/lcsb/mapviewer/bean/LayoutBean.java b/web/src/main/java/lcsb/mapviewer/bean/LayoutBean.java
index 6ade0bf8dc1dc09f81a145239813fff3a5d3acf9..2c866c388497b506597d22ffce6ceeb5519128c1 100644
--- a/web/src/main/java/lcsb/mapviewer/bean/LayoutBean.java
+++ b/web/src/main/java/lcsb/mapviewer/bean/LayoutBean.java
@@ -255,7 +255,7 @@ public class LayoutBean extends AbstractManagedBean implements Serializable {
 	public void refreshCustomLayouts(final ActionEvent actionEvent) {
 		User user = userBean.getLoggedUser();
 		Model model = getCurrentTopModel();
-		customLayouts = layoutService.getCustomLayouts(model, user);
+		customLayouts = layoutService.getCustomLayouts(model, user, true, user);
 		generalLayouts = layoutService.getGeneralLayouts(model);
 	}
 
diff --git a/web/src/test/java/lcsb/mapviewer/bean/LayoutBeanTest.java b/web/src/test/java/lcsb/mapviewer/bean/LayoutBeanTest.java
index cd7db2f4b97adbe945e189b519eb9ee4d1afa1db..d6295ff11d0abc3dbb42f1a13ede34cbee078f7b 100644
--- a/web/src/test/java/lcsb/mapviewer/bean/LayoutBeanTest.java
+++ b/web/src/test/java/lcsb/mapviewer/bean/LayoutBeanTest.java
@@ -183,7 +183,7 @@ public class LayoutBeanTest extends WebTestFunctions {
 			layoutBean.addLayout(null);
 
 			// wait until layout is generated
-			Integer id = Integer.valueOf(layoutService.getCustomLayouts(model, user).get(0).getIdObject());
+			Integer id = Integer.valueOf(layoutService.getCustomLayouts(model, user, true, user).get(0).getIdObject());
 			Layout l = layoutDao.getById(id);
 			do {
 				Thread.sleep(200);