diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java
index 3d4e0aefa32b4c6f4b6cb089b59c0e5febf11dd8..4a79e688995d55ed2c745d34f076b77cb21884a9 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java
@@ -15,9 +15,9 @@ import java.util.Map;
 import org.apache.log4j.Logger;
 
 import lcsb.mapviewer.commands.ColorExtractor;
+import lcsb.mapviewer.commands.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.common.MimeType;
 import lcsb.mapviewer.converter.graphics.bioEntity.BioEntityConverterImpl;
-import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.converter.graphics.layer.LayerConverter;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.compartment.PathwayCompartment;
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java
index 30a411a81063519af7742b1ed65448b776a6e6a6..9575da4d8082aded32214a61a844fba09715c2bf 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java
@@ -6,6 +6,7 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 
+import lcsb.mapviewer.commands.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java
index 842e457046c096c80786e9a2dd5370c97b18043e..b3291603acb9700c5969164c6950ea93d79c0444 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java
@@ -9,12 +9,12 @@ import java.util.List;
 import org.apache.log4j.Logger;
 
 import lcsb.mapviewer.commands.ColorExtractor;
+import lcsb.mapviewer.commands.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.geometry.EllipseTransformation;
 import lcsb.mapviewer.common.geometry.LineTransformation;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
-import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.converter.graphics.bioEntity.element.ElementConverter;
 import lcsb.mapviewer.converter.graphics.geometry.FontFinder;
 import lcsb.mapviewer.converter.graphics.geometry.RectangleTooSmallException;
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/ComplexConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/ComplexConverter.java
index 8c36e5f603ff79e8573a724de9b509ff80fc04f4..cdbd34fd89ddc331ba5c0be7ffead8693035e916 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/ComplexConverter.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/ComplexConverter.java
@@ -12,8 +12,8 @@ import java.awt.geom.PathIterator;
 import org.apache.log4j.Logger;
 
 import lcsb.mapviewer.commands.ColorExtractor;
+import lcsb.mapviewer.commands.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
-import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.converter.graphics.geometry.FontFinder;
 import lcsb.mapviewer.converter.graphics.geometry.RectangleTooSmallException;
 import lcsb.mapviewer.model.graphics.LineType;
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java
index ce768f16013b2feffe696a480bc2b36a9e8278fc..82edaed71deeef1652acfb4d66c4383cdb99e8ef 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java
@@ -16,12 +16,12 @@ import java.util.List;
 import org.apache.log4j.Logger;
 
 import lcsb.mapviewer.commands.ColorExtractor;
+import lcsb.mapviewer.commands.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.common.geometry.EllipseTransformation;
 import lcsb.mapviewer.common.geometry.LineTransformation;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
-import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.converter.graphics.bioEntity.element.ElementConverter;
 import lcsb.mapviewer.model.graphics.LineType;
 import lcsb.mapviewer.model.map.layout.ColorSchema;
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/placefinder/PlaceFinder.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/placefinder/PlaceFinder.java
index 98dc0c33be24e7eab7c870df6defb55c4edeb3d1..474275f24240426e29992f8e95fb33107f37f06b 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/placefinder/PlaceFinder.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/placefinder/PlaceFinder.java
@@ -8,7 +8,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
-import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
+import lcsb.mapviewer.commands.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.species.Element;
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java b/model-command/src/main/java/lcsb/mapviewer/commands/SemanticZoomLevelMatcher.java
similarity index 89%
rename from converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java
rename to model-command/src/main/java/lcsb/mapviewer/commands/SemanticZoomLevelMatcher.java
index a5c28959bc3b5294e7dfc17ecee784ebe1f10249..38920e1caed5f00fc4017059749400b3a141f9e0 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java
+++ b/model-command/src/main/java/lcsb/mapviewer/commands/SemanticZoomLevelMatcher.java
@@ -1,6 +1,9 @@
-package lcsb.mapviewer.converter.graphics.bioEntity;
+package lcsb.mapviewer.commands;
+
+import org.apache.log4j.Logger;
 
 public class SemanticZoomLevelMatcher {
+	Logger logger = Logger.getLogger(SemanticZoomLevelMatcher.class);
 
 	/**
 	 * Checks if level belongs to the range defined in
@@ -15,7 +18,7 @@ public class SemanticZoomLevelMatcher {
 	public boolean isVisible(int level, String semanticZoomLevelVisibility) {
 		return matchLevel(level, semanticZoomLevelVisibility);
 	}
-	
+
 	public boolean isTransparent(int level, String semanticZoomLevelVisibility) {
 		return matchLevel(level, semanticZoomLevelVisibility);
 	}
@@ -38,6 +41,5 @@ public class SemanticZoomLevelMatcher {
 		}
 		return false;
 	}
-	
 
 }
diff --git a/model-command/src/main/java/lcsb/mapviewer/commands/SetFixedHierarchyLevelCommand.java b/model-command/src/main/java/lcsb/mapviewer/commands/SetFixedHierarchyLevelCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6c341cbaf5842d3f5a453551273f1ca584149e9
--- /dev/null
+++ b/model-command/src/main/java/lcsb/mapviewer/commands/SetFixedHierarchyLevelCommand.java
@@ -0,0 +1,61 @@
+package lcsb.mapviewer.commands;
+
+import org.apache.log4j.Logger;
+
+import lcsb.mapviewer.common.exception.InvalidStateException;
+import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.map.BioEntity;
+import lcsb.mapviewer.model.map.model.Model;
+
+/**
+ * This {@link ModelCommand command} class allows to transform model into
+ * multilevel (nested) component structure. Some artificial compartments will
+ * appear. All compartments have information about children compartments. All
+ * objects have information about parents.
+ * 
+ * 
+ */
+public class SetFixedHierarchyLevelCommand extends ModelCommand {
+	/**
+	 * Default class logger.
+	 */
+	@SuppressWarnings("unused")
+	private static Logger	logger = Logger.getLogger(SetFixedHierarchyLevelCommand.class);
+	private Integer				level;
+
+	public SetFixedHierarchyLevelCommand(Model model, Integer level) {
+		super(model);
+		this.level = level;
+	}
+
+	@Override
+	protected void undoImplementation() {
+		throw new NotImplementedException();
+	}
+
+	@Override
+	protected void executeImplementation() {
+		if (!ModelCommandStatus.CREATED.equals(getStatus()) && !ModelCommandStatus.UNDONE.equals(getStatus())) {
+			throw new InvalidStateException("To execute command, the command must be in CREATED or UNDONE state. " + getStatus() + " found.");
+		}
+		if (level != null) {
+			SemanticZoomLevelMatcher matcher = new SemanticZoomLevelMatcher();
+			Model output = getModel();
+			for (BioEntity bioEntity : output.getBioEntities()) {
+				if (matcher.isVisible(level, bioEntity.getVisibilityLevel())) {
+					bioEntity.setVisibilityLevel("0");
+				} else {
+					bioEntity.setVisibilityLevel(Integer.MAX_VALUE + "");
+				}
+			}
+		}
+
+		setStatus(ModelCommandStatus.EXECUTED);
+	}
+
+	@Override
+	protected void redoImplementation() {
+		throw new NotImplementedException();
+	}
+
+}
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
index cd27a466621918fa8f2c7c3939d532c8a50410d8..e94aede152e363f10eba7fcb170051b7bbe674fc 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
@@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 import lcsb.mapviewer.api.BaseRestImpl;
+import lcsb.mapviewer.api.ObjectNotFoundException;
 import lcsb.mapviewer.api.QueryException;
 import lcsb.mapviewer.api.projects.models.publications.PublicationsRestImpl;
 import lcsb.mapviewer.commands.ClearColorModelCommand;
@@ -26,6 +27,7 @@ import lcsb.mapviewer.commands.ColorExtractor;
 import lcsb.mapviewer.commands.ColorModelCommand;
 import lcsb.mapviewer.commands.CommandExecutionException;
 import lcsb.mapviewer.commands.CopyCommand;
+import lcsb.mapviewer.commands.SetFixedHierarchyLevelCommand;
 import lcsb.mapviewer.commands.SubModelCommand;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.converter.ConverterException;
@@ -45,7 +47,6 @@ import lcsb.mapviewer.model.map.layout.ColorSchema;
 import lcsb.mapviewer.model.map.layout.InvalidColorSchemaException;
 import lcsb.mapviewer.model.map.layout.Layout;
 import lcsb.mapviewer.model.map.model.Model;
-import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.services.SecurityException;
 import lcsb.mapviewer.services.interfaces.ILayoutService;
@@ -220,41 +221,44 @@ public class ProjectRestImpl extends BaseRestImpl {
 
 		Model topModel = modelService.getLastModelByProjectId(projectId, authenticationToken);
 		if (topModel == null) {
-			throw new QueryException("Project with given id doesn't exist");
+			throw new ObjectNotFoundException("Project with given id doesn't exist");
 		}
 
 		Model originalModel = topModel.getSubmodelById(modelId);
 
 		if (originalModel == null) {
-			throw new QueryException("Model with given id doesn't exist");
+			throw new ObjectNotFoundException("Model with given id doesn't exist");
 		}
 
-		Layout layout = null;
+		Layout overlay = null;
 		if (!backgroundOverlayId.equals("")) {
-			layout = topModel.getLayoutByIdentifier(Integer.valueOf(backgroundOverlayId));
+			overlay = topModel.getLayoutByIdentifier(Integer.valueOf(backgroundOverlayId));
 
-			if (layout == null) {
-				throw new QueryException("Unknown layout in model. Layout.id=" + backgroundOverlayId);
+			if (overlay == null) {
+				throw new ObjectNotFoundException("Unknown overlay in model. Layout.id=" + backgroundOverlayId);
+			}
+		} else {
+			if (topModel.getLayouts().size() > 0) {
+				overlay = topModel.getLayouts().get(0);
 			}
 		}
 
 		Model colorModel = new CopyCommand(originalModel).execute();
-		if (layout != null) {
-			if (layout.getInputData() != null) {
+		if (overlay != null) {
+			if (overlay.getInputData() != null) {
 				ColorSchemaReader reader = new ColorSchemaReader();
-				Collection<ColorSchema> schemas = reader.readColorSchema(layout.getInputData().getFileContent());
+				Collection<ColorSchema> schemas = reader.readColorSchema(overlay.getInputData().getFileContent());
 
 				new ColorModelCommand(colorModel, schemas, userService.getColorExtractorForUser(user)).execute();
-			} else if (layout.getTitle().equals(BuildInLayout.CLEAN.getTitle())) {
+			} else if (overlay.getTitle().equals(BuildInLayout.CLEAN.getTitle())) {
 				// this might not return true if we change CLEAN.title in future...
 
 				// if it's clean then remove coloring
 				new ClearColorModelCommand(colorModel).execute();
+			} else if (overlay.isHierarchicalView()) {
+				new SetFixedHierarchyLevelCommand(colorModel, overlay.getHierarchyViewLevel()).execute();
 			}
 		}
-		for (Element alias : colorModel.getElements()) {
-			alias.setVisibilityLevel(0);
-		}
 
 		Integer level = Configuration.MIN_ZOOM_LEVEL;
 		if (!zoomLevel.equals("")) {
@@ -299,13 +303,16 @@ public class ProjectRestImpl extends BaseRestImpl {
 				y(minY).//
 				height((maxY - minY) / scale).//
 				width((maxX - minX) / scale).//
-				level(level).//
+				level(level - Configuration.MIN_ZOOM_LEVEL).//
 				nested(false).// automatically set nested view as invalid
 				scale(scale).//
 				minColor(colorExtractor.getMinColor()).//
 				maxColor(colorExtractor.getMaxColor()).//
 				sbgn(topModel.getProject().isSbgnFormat()).//
 				model(colorModel);
+		if (overlay != null) {
+			params.nested(overlay.isHierarchicalView());
+		}
 		List<Integer> visibleLayoutIds = deserializeIdList(overlayIds);
 		for (Integer integer : visibleLayoutIds) {
 			Map<Object, ColorSchema> map = layoutService.getElementsForLayout(colorModel, integer, authenticationToken);
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
index 2794c4adcc2fabfa0c15d41f9a6e770172f0529e..3b89d7beb930badc503eaea4f6f57a01ff28e13f 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -40,6 +40,7 @@ import lcsb.mapviewer.commands.ClearColorModelCommand;
 import lcsb.mapviewer.commands.CommandExecutionException;
 import lcsb.mapviewer.commands.CopyCommand;
 import lcsb.mapviewer.commands.CreateHierarchyCommand;
+import lcsb.mapviewer.commands.SetFixedHierarchyLevelCommand;
 import lcsb.mapviewer.common.EventStorageLoggerAppender;
 import lcsb.mapviewer.common.IProgressUpdater;
 import lcsb.mapviewer.common.Pair;
@@ -52,7 +53,6 @@ import lcsb.mapviewer.converter.InvalidInputDataExecption;
 import lcsb.mapviewer.converter.graphics.DrawingException;
 import lcsb.mapviewer.converter.graphics.MapGenerator;
 import lcsb.mapviewer.converter.graphics.MapGenerator.MapGeneratorParams;
-import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
 import lcsb.mapviewer.converter.model.sbgnml.SbgnmlXmlConverter;
 import lcsb.mapviewer.converter.zip.ZipEntryFile;
@@ -639,6 +639,7 @@ public class ProjectService implements IProjectService {
 		Model output = model;
 		if (layout.isHierarchicalView()) {
 			output = new CopyCommand(model).execute();
+			new SetFixedHierarchyLevelCommand(output, layout.getHierarchyViewLevel()).execute();
 		}
 		if (layout.getTitle().equals(BuildInLayout.CLEAN.getTitle())) {
 			output = new CopyCommand(model).execute();
@@ -647,26 +648,10 @@ public class ProjectService implements IProjectService {
 
 		MapGeneratorParams imgParams = generator.new MapGeneratorParams()
 				.directory(directory).sbgn(params.isSbgnFormat()).nested(layout.isHierarchicalView()).updater(updater);
-		if (layout.getHierarchyViewLevel() != null) {
-			output = prepareSemanticZoomModel(model, layout.getHierarchyViewLevel());
-		}
 		imgParams.model(output);
 		generator.generateMapImages(imgParams);
 	}
 
-	private Model prepareSemanticZoomModel(final Model model, int level) {
-		SemanticZoomLevelMatcher matcher = new SemanticZoomLevelMatcher();
-		Model output = new CopyCommand(model).execute();
-		for (BioEntity bioEntity : output.getBioEntities()) {
-			if (matcher.isVisible(level, bioEntity.getVisibilityLevel())) {
-				bioEntity.setVisibilityLevel("0");
-			} else {
-				bioEntity.setVisibilityLevel(Integer.MAX_VALUE + "");
-			}
-		}
-		return output;
-	}
-
 	/**
 	 * Creates project. Loads model from the input and run PostLoadModification.
 	 * 
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java b/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java
index e4898431923acb28d1ecc1aaec65dd33de348946..d7755071ab1c7d771f9aab2d8b28b7d5610425dc 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java
@@ -14,11 +14,11 @@ import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
+import lcsb.mapviewer.commands.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.InvalidClassException;
 import lcsb.mapviewer.common.exception.InvalidStateException;
-import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.model.map.BioEntity;
 import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.model.map.MiriamType;