diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/NoteField.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/NoteField.java
index db00f59da024510942394ca4db3cf790efa3d0f4..f9ec3e0770b7e80ca0f178a8dded4d8d3aa8dcf8 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/NoteField.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/NoteField.java
@@ -5,6 +5,8 @@ import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSpecies
 import lcsb.mapviewer.model.map.AnnotatedObject;
 import lcsb.mapviewer.model.map.MiriamType;
 import lcsb.mapviewer.model.map.reaction.Reaction;
+import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.Species;
 
 /**
  * Describes structural information that appears in the cell designer notes.
@@ -116,7 +118,12 @@ public enum NoteField {
 	/**
 	 * {@link Species#charge}.
 	 */
-	CHARGE("Charge", CellDesignerSpecies.class, null); //
+	CHARGE("Charge", CellDesignerSpecies.class, null), //
+
+	/**
+	 * {@link Element#getSemanticZoomLevelVisibility()}.
+	 */
+	SEMANTIC_ZOOM_LEVEL_VISIBILITY("SemanticZoomLevelVisibility", AnnotatedObject.class, null); //
 
 	/**
 	 * Name used in the notes to distinguish fields.
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java
index b46d75a00ff20d1f8623ba227e437b44f9d5ce6c..24021c6d339acc1db72e219a2ef94d811c14c5a2 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java
@@ -562,6 +562,20 @@ public class RestAnnotationParser extends XmlParser {
 		}
 	}
 
+	private void setSemanticZoomLevelVisibility(AnnotatedObject element, String annotationString) {
+		String zoomLevelVisibility = getParamByPrefix(annotationString, NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY.getCommonName() + ":");
+		if (zoomLevelVisibility == null) {
+			return;
+		}
+		if (element.getSemanticZoomLevelVisibility() == null) {
+			element.setSemanticZoomLevelVisibility(zoomLevelVisibility);
+		} else if (!element.getSemanticZoomLevelVisibility().equals(zoomLevelVisibility)) {
+			logger.warn(
+					elementUtils.getElementTag(element) + " New " + NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY.getCommonName() + " different than default ["
+							+ zoomLevelVisibility + "][" + element.getSemanticZoomLevelVisibility() + "]. Ignoring.");
+		}
+	}
+
 	/**
 	 * Assigns notes to the element from notes string. This might look strange.
 	 * The idea is that sometimes we have notes from more then one source. And the
@@ -620,6 +634,7 @@ public class RestAnnotationParser extends XmlParser {
 		setNotes(object, ann);
 		setSymbol(object, ann);
 		setSynonyms(object, ann);
+		setSemanticZoomLevelVisibility(object, ann);
 		setAbbreviation(object, ann);
 		setFormula(object, ann);
 		if (object instanceof Reaction) {
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 e452e977f39d17e4ce86d0f06631430afd253bc9..b68a48171a95b851ea030085623717a0388ef1ca 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
@@ -17,7 +17,6 @@ import org.apache.log4j.Logger;
 import lcsb.mapviewer.commands.ColorExtractor;
 import lcsb.mapviewer.common.MimeType;
 import lcsb.mapviewer.converter.graphics.bioEntity.BioEntityConverterImpl;
-import lcsb.mapviewer.converter.graphics.bioEntity.reaction.ReactionConverter;
 import lcsb.mapviewer.converter.graphics.layer.LayerConverter;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.compartment.PathwayCompartment;
@@ -173,6 +172,7 @@ public abstract class AbstractImageGenerator {
 		 * Should the visualization include hierarchical view or not.
 		 */
 		private boolean												 nested					= false;
+		private boolean												 semanticZoom		= false;
 
 		/**
 		 * Should sbgn standard be used.
@@ -208,6 +208,11 @@ public abstract class AbstractImageGenerator {
 			this.scale = scale;
 			return this;
 		}
+		
+		public Params semanticZoom(boolean semanticZoom) {
+			this.semanticZoom = semanticZoom;
+			return this;
+		}
 
 		/**
 		 * @param scale
@@ -661,13 +666,13 @@ public abstract class AbstractImageGenerator {
 			// compartment/complexes)
 			if (element instanceof Species) {
 				if (((Species) element).getComplex() == null) {
-					drawSpecies((Species) element, params.getVisibleLayoutsForElement(element));
+					drawSpecies((Species) element, params.getVisibleLayoutsForElement(element), params);
 				}
 			}
 		}
 		// draw all reactions
 		for (Reaction reaction : params.getModel().getSortedReactions()) {
-			drawReaction(reaction, params.getVisibleLayoutsForElement(reaction));
+			drawReaction(reaction, params.getVisibleLayoutsForElement(reaction), params);
 		}
 		// draw all compartments
 		for (Compartment compartment : params.getModel().getSortedCompartments()) {
@@ -741,7 +746,7 @@ public abstract class AbstractImageGenerator {
 
 		// get a converter for this compartment
 		BioEntityConverterImpl converter = new BioEntityConverterImpl(compartment, colorExtractor);
-		ConverterParams compartmentParams = new ConverterParams().textCentered(fill).level(level);
+		ConverterParams compartmentParams = new ConverterParams().textCentered(fill).level(level).semanticZoomingOn(params.semanticZoom);
 
 		if (nested) {
 			compartmentParams.fill(fill).scale(Math.max(scale, 1));
@@ -771,7 +776,7 @@ public abstract class AbstractImageGenerator {
 		for (Element element : result) {
 			// if a child is a standard species
 			if (element instanceof Species) {
-				drawSpecies((Species) element, params.getVisibleLayoutsForElement(element));
+				drawSpecies((Species) element, params.getVisibleLayoutsForElement(element), params);
 			} else if (element instanceof Compartment) {
 				drawCompartment((Compartment) element, nested, params.getVisibleLayoutsForElement(element), params);
 			} else {
@@ -795,10 +800,11 @@ public abstract class AbstractImageGenerator {
 	 *          object to be drawn
 	 * @param visibleLayouts
 	 *          list of {@link ColorSchema} used for coloring species in layouts
+	 * @param params
 	 * @throws DrawingException
 	 *           thrown when there was a problem with drawing a {@link Species}
 	 */
-	protected void drawSpecies(final Species species, List<ColorSchema> visibleLayouts) throws DrawingException {
+	protected void drawSpecies(final Species species, List<ColorSchema> visibleLayouts, Params params) throws DrawingException {
 
 		// The displaying of species is indicated by values of VisibilityLevel. If
 		// VisibilityLevel is big enough, then it is
@@ -833,7 +839,10 @@ public abstract class AbstractImageGenerator {
 			customScale = scale;
 		}
 		try {
-			converter.draw(species, graphics, new ConverterParams().scale(customScale).textCentered(rescale).level(level).sbgnFormat(sbgnFormat), visibleLayouts);
+			converter.draw(
+					species, graphics,
+					new ConverterParams().scale(customScale).textCentered(rescale).level(level).sbgnFormat(sbgnFormat).semanticZoomingOn(params.semanticZoom),
+					visibleLayouts);
 		} catch (Exception e) {
 			throw new DrawingException(eu.getElementTag(species) + "Problem with drawing element.", e);
 		}
@@ -848,7 +857,7 @@ public abstract class AbstractImageGenerator {
 				// depending on current zoom level, children are drawn or not
 				if (complex.getTransparencyLevel() <= level) {
 					for (Species a : complex.getElements()) {
-						drawSpecies(a, visibleLayouts);
+						drawSpecies(a, visibleLayouts, params);
 					}
 				}
 			}
@@ -862,13 +871,14 @@ public abstract class AbstractImageGenerator {
 	 *          object to be drawn
 	 * @param visibleLayouts
 	 *          list of {@link ColorSchema} used for coloring reaction in layouts
+	 * @param params
 	 */
-	protected void drawReaction(final Reaction reaction, List<ColorSchema> visibleLayouts) {
+	protected void drawReaction(final Reaction reaction, List<ColorSchema> visibleLayouts, Params params) {
 		if (!cross(reaction.getLines())) {
 			return;
 		}
 		BioEntityConverterImpl converter = new BioEntityConverterImpl(reaction, sbgnFormat, colorExtractor);
-		converter.draw(reaction, graphics, new ConverterParams().sbgnFormat(sbgnFormat), visibleLayouts);
+		converter.draw(reaction, graphics, new ConverterParams().sbgnFormat(sbgnFormat).semanticZoomingOn(params.semanticZoom).level(level), visibleLayouts);
 	}
 
 	/**
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/MapGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/MapGenerator.java
index d9e35b48dfd43e10d49d4a9e2c4a9a7a61bb8f05..56c6e0722c2e4db01ae81a39bd1ce76b475959c8 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/MapGenerator.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/MapGenerator.java
@@ -58,6 +58,7 @@ public class MapGenerator {
 		 * 
 		 */
 		private boolean					 nested			 = false;
+		private boolean					 semanticZoom		 = false;
 		/**
 		 * Should we remove empty elements in nested view.
 		 * 
@@ -134,6 +135,11 @@ public class MapGenerator {
 			this.nested = nested;
 			return this;
 		}
+		
+		public MapGeneratorParams semanticZoom(boolean semanticZoom) {
+			this.semanticZoom = semanticZoom;
+			return this;
+		}
 
 		/**
 		 * @return the removeEmpty
@@ -326,6 +332,8 @@ public class MapGenerator {
 						imgParams.height(TILE_SIZE * TILES_CACHE_NUM);
 						imgParams.model(params.model);
 						imgParams.sbgn(params.sbgn);
+						imgParams.level(i);
+						imgParams.semanticZoom(params.semanticZoom);
 
 						if (params.nested) {
 							imgParams.level(i).nested(params.nested);
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 b08d9376456080ddffacf74664e64b7a29815dd8..b8a32ba7767c231bda64d3693e75733a51df6187 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
@@ -4,11 +4,22 @@ import java.awt.Graphics2D;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.log4j.Logger;
+
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
+import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
 import lcsb.mapviewer.converter.graphics.DrawingException;
 import lcsb.mapviewer.model.map.AnnotatedObject;
+import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.layout.ColorSchema;
+import lcsb.mapviewer.model.map.reaction.AbstractNode;
+import lcsb.mapviewer.model.map.reaction.NodeOperator;
+import lcsb.mapviewer.model.map.reaction.ReactionNode;
+import lcsb.mapviewer.model.map.species.Complex;
 import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.modelutils.map.ElementUtils;
 
 /**
  * This interface defines what operations should be possible to convert
@@ -20,11 +31,17 @@ import lcsb.mapviewer.model.map.species.Element;
  *          class of alias to convert
  */
 public abstract class BioEntityConverter<T extends AnnotatedObject> {
+
+	/**
+	 * Default class logger.
+	 */
+	private final Logger		logger			 = Logger.getLogger(BioEntityConverter.class);
+
 	/**
 	 * Alpha value (0..255) used for visualizing overlay data that are normally
 	 * visualized in javascript.
 	 */
-	public static final int LAYOUT_ALPHA = 200;
+	public static final int	LAYOUT_ALPHA = 200;
 
 	/**
 	 * This function draw representation of the alias on the graphics object.
@@ -77,4 +94,69 @@ public abstract class BioEntityConverter<T extends AnnotatedObject> {
 	 */
 	public abstract void drawText(T bioEntity, Graphics2D graphics, ConverterParams params) throws DrawingException;
 
+	protected boolean isVisible(AbstractNode node, ConverterParams params) {
+		if (node instanceof NodeOperator) {
+			return isVisible((NodeOperator) node, params);
+		} else if (node instanceof ReactionNode) {
+			return isVisible(((ReactionNode) node).getElement(), params);
+		} else {
+			throw new InvalidArgumentException("Unknown class type: " + node.getClass());
+		}
+	}
+
+	protected boolean isVisible(NodeOperator operator, ConverterParams params) {
+		boolean result = false;
+		if (operator.isModifierOperator() || operator.isReactantOperator()) {
+			for (AbstractNode input : operator.getInputs()) {
+				result |= isVisible(input, params);
+			}
+		} else if (operator.isProductOperator()) {
+			for (AbstractNode output : operator.getOutputs()) {
+				result |= isVisible(output, params);
+			}
+		} else {
+			throw new InvalidStateException("Unknown class state: " + operator);
+		}
+		return result;
+	}
+
+	protected boolean isVisible(AnnotatedObject bioEntity, ConverterParams params) {
+		if (params.isSemanticZoomingOn()) {
+			boolean result = matchLevel(params.getLevel(), bioEntity.getSemanticZoomLevelVisibility());
+			if (bioEntity instanceof Element) {
+				Compartment compartment = ((Element) bioEntity).getCompartment();
+				if (compartment != null) {
+					result &= isVisible(compartment, params);
+				}
+				if (bioEntity instanceof Species) {
+					Complex complex = ((Species) bioEntity).getComplex();
+					if (complex != null) {
+						result &= isVisible(complex, params);
+					}
+				}
+			}
+			return result;
+		}
+		return true;
+	}
+
+	protected boolean matchLevel(int level, String semanticZoomLevelVisibility) {
+		if (semanticZoomLevelVisibility == null || semanticZoomLevelVisibility.isEmpty()) {
+			return true;
+		}
+		if (semanticZoomLevelVisibility.contains("{")) {
+			String strLevels = semanticZoomLevelVisibility.replace("{", "").replace("}", "");
+			String[] ranges = strLevels.split(",");
+			for (String string : ranges) {
+				if (Integer.valueOf(string).equals(level)) {
+					return true;
+				}
+			}
+		}
+		if (Integer.valueOf(semanticZoomLevelVisibility) <= level) {
+			return true;
+		}
+		return false;
+	}
+
 }
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java
index 595065c8fcd8e49a8eddf86a892502040150ea6c..bb68987a1ce1d12af1161f848bfea2622930a5ce 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java
@@ -182,12 +182,17 @@ public class BioEntityConverterImpl extends BioEntityConverter<AnnotatedObject>
 	@SuppressWarnings("unchecked")
 	@Override
 	public void drawText(final AnnotatedObject element, final Graphics2D graphics, final ConverterParams params) throws DrawingException {
-		elementConverter.drawText(element, graphics, params);
+		if (isVisible(element, params)) {
+			elementConverter.drawText(element, graphics, params);
+		}
 	}
 
 	@SuppressWarnings("unchecked")
 	@Override
 	public void draw(AnnotatedObject element, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) {
-		elementConverter.draw(element, graphics, params, visualizedLayoutsColorSchemas);
+		if (isVisible(element, params)) {
+			elementConverter.draw(element, graphics, params, visualizedLayoutsColorSchemas);
+		}
 	}
+
 }
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverter.java
index f325a9d8d04b78136267ae166876b1858a8303c3..b50c7ef53d1d4e382dc07264e9351a2c26ff2e9a 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverter.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverter.java
@@ -15,8 +15,6 @@ import org.apache.log4j.Logger;
 
 import lcsb.mapviewer.commands.ColorExtractor;
 import lcsb.mapviewer.common.Pair;
-import lcsb.mapviewer.common.exception.InvalidArgumentException;
-import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.common.geometry.LineTransformation;
 import lcsb.mapviewer.common.geometry.PointTransformation;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
@@ -26,8 +24,6 @@ import lcsb.mapviewer.converter.graphics.geometry.ArrowTransformation;
 import lcsb.mapviewer.model.graphics.ArrowType;
 import lcsb.mapviewer.model.graphics.ArrowTypeData;
 import lcsb.mapviewer.model.graphics.PolylineData;
-import lcsb.mapviewer.model.map.AnnotatedObject;
-import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.layout.ColorSchema;
 import lcsb.mapviewer.model.map.layout.GenericColorSchema;
 import lcsb.mapviewer.model.map.reaction.AbstractNode;
@@ -36,11 +32,7 @@ import lcsb.mapviewer.model.map.reaction.NodeOperator;
 import lcsb.mapviewer.model.map.reaction.Product;
 import lcsb.mapviewer.model.map.reaction.Reactant;
 import lcsb.mapviewer.model.map.reaction.Reaction;
-import lcsb.mapviewer.model.map.reaction.ReactionNode;
 import lcsb.mapviewer.model.map.reaction.type.ReactionRect;
-import lcsb.mapviewer.model.map.species.Complex;
-import lcsb.mapviewer.model.map.species.Element;
-import lcsb.mapviewer.model.map.species.Species;
 
 /**
  * Thics class allows to draw reaction on the graphics2D.
@@ -230,71 +222,6 @@ public class ReactionConverter extends BioEntityConverter<Reaction> {
 		graphics.setColor(color);
 	}
 
-	private boolean isVisible(AbstractNode node, ConverterParams params) {
-		if (node instanceof NodeOperator) {
-			return isVisible((NodeOperator) node, params);
-		} else if (node instanceof ReactionNode) {
-			return isVisible(((ReactionNode) node).getElement(), params);
-		} else {
-			throw new InvalidArgumentException("Unknown class type: " + node.getClass());
-		}
-	}
-
-	private boolean isVisible(NodeOperator operator, ConverterParams params) {
-		boolean result = false;
-		if (operator.isModifierOperator() || operator.isReactantOperator()) {
-			for (AbstractNode input : operator.getInputs()) {
-				result |= isVisible(input, params);
-			}
-		} else if (operator.isProductOperator()) {
-			for (AbstractNode output : operator.getOutputs()) {
-				result |= isVisible(output, params);
-			}
-		} else {
-			throw new InvalidStateException("Unknown class state: " + operator);
-		}
-		return result;
-	}
-
-	private boolean isVisible(AnnotatedObject bioEntity, ConverterParams params) {
-		if (params.isSemanticZoomingOn()) {
-			boolean result = matchLevel(params.getLevel(), bioEntity.getSemanticZoomLevelVisibility());
-			if (bioEntity instanceof Element) {
-				Compartment compartment = ((Element) bioEntity).getCompartment();
-				if (compartment != null) {
-					result &= isVisible(compartment, params);
-				}
-				if (bioEntity instanceof Species) {
-					Complex complex = ((Species) bioEntity).getComplex();
-					if (complex != null) {
-						result &= isVisible(complex, params);
-					}
-				}
-			}
-			return result;
-		}
-		return true;
-	}
-
-	private boolean matchLevel(int level, String semanticZoomLevelVisibility) {
-		if (semanticZoomLevelVisibility == null || semanticZoomLevelVisibility.isEmpty()) {
-			return true;
-		}
-		if (semanticZoomLevelVisibility.contains("{")) {
-			String strLevels = semanticZoomLevelVisibility.replace("{", "").replace("}", "");
-			String[] ranges = strLevels.split(",");
-			for (String string : ranges) {
-				if (Integer.valueOf(string).equals(level)) {
-					return true;
-				}
-			}
-		}
-		if (Integer.valueOf(semanticZoomLevelVisibility) <= level) {
-			return true;
-		}
-		return false;
-	}
-
 	/**
 	 * Draw reaction on the graphics2D.
 	 * 
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 eea455176c321f0b3e8fc651fc288a3196ff29fa..212e7360c7dcd0c7e1849862b1e3126a30c488ac 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -636,6 +636,9 @@ public class ProjectService implements IProjectService {
 											IProgressUpdater.MAX_PROGRESS * imgCounter / finalSize + progress / finalSize, params);
 								}
 							});
+					if (layout.getTitle().contains(BuildInLayout.SEMANTIC.getTitle())) {
+						imgParams.semanticZoom(params.isSemanticZoom());
+					}
 					generator.generateMapImages(imgParams);
 				}
 				counter++;
@@ -704,18 +707,21 @@ public class ProjectService implements IProjectService {
 		if (params.isNetworkLayoutAsDefault()) {
 			buildInLayouts.add(BuildInLayout.NORMAL);
 			for (BuildInLayout buildInLayout : BuildInLayout.values()) {
-				if (!buildInLayout.equals(BuildInLayout.NORMAL)) {
+				if (!buildInLayout.equals(BuildInLayout.NORMAL) && !buildInLayout.equals(BuildInLayout.SEMANTIC)) {
 					buildInLayouts.add(buildInLayout);
 				}
 			}
 		} else {
 			buildInLayouts.add(BuildInLayout.NESTED);
 			for (BuildInLayout buildInLayout : BuildInLayout.values()) {
-				if (!buildInLayout.equals(BuildInLayout.NESTED)) {
+				if (!buildInLayout.equals(BuildInLayout.NESTED) && !buildInLayout.equals(BuildInLayout.SEMANTIC)) {
 					buildInLayouts.add(buildInLayout);
 				}
 			}
 		}
+		if (params.isSemanticZoom()) {
+			buildInLayouts.add(BuildInLayout.SEMANTIC);
+		}
 
 		// reverse the order of build in layouts, so we can insert them at the
 		// beginning of list of layouts (the order will be the same)
diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java b/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
index 7edaee16379296a7511c59557ccdcb652ddc5ba4..21df2ed92d971e0160604b9b9f9b859b8075fdcf 100644
--- a/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
+++ b/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
@@ -59,6 +59,7 @@ public class CreateProjectParams {
 	 * Is the project a complex multi-file project.
 	 */
 	private boolean																								 complex;
+	private boolean																								 semanticZoom;
 
 	/**
 	 * List of zip entries in the complex model definition.
@@ -722,4 +723,13 @@ public class CreateProjectParams {
 		return this;
 	}
 
+	public CreateProjectParams semanticZoom(boolean semanticZoom) {
+		this.semanticZoom = semanticZoom;
+		return this;
+	}
+
+	public boolean isSemanticZoom() {
+		return this.semanticZoom;
+	}
+
 }
diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/data/BuildInLayout.java b/service/src/main/java/lcsb/mapviewer/services/utils/data/BuildInLayout.java
index 13011324b3e60a4f273d4a3e8fe6cef6be72938a..3bdf5704f793378735a463ae359cb91e99cd36fe 100644
--- a/service/src/main/java/lcsb/mapviewer/services/utils/data/BuildInLayout.java
+++ b/service/src/main/java/lcsb/mapviewer/services/utils/data/BuildInLayout.java
@@ -32,6 +32,7 @@ public enum BuildInLayout { //
 	 * Standard visualization with hierarchical view.
 	 */
 	NESTED("Pathways and compartments", "_nested", null, true),
+	SEMANTIC("Semantic zoom", "_semantic", null, false),
 	/**
 	 * Clean visualization (with colors reset to black and white).
 	 */
diff --git a/web/src/main/java/lcsb/mapviewer/bean/ProjectBean.java b/web/src/main/java/lcsb/mapviewer/bean/ProjectBean.java
index bafe1cd65ace628698072d51d347e9bc89035db9..0e08e4a105f21283040a4609fe99c885458f1cfb 100644
--- a/web/src/main/java/lcsb/mapviewer/bean/ProjectBean.java
+++ b/web/src/main/java/lcsb/mapviewer/bean/ProjectBean.java
@@ -209,6 +209,8 @@ public class ProjectBean extends AbstractManagedBean implements Serializable {
 	 */
 	private String													 sbgnFormat																	= "false";
 
+	private String													 semanticOverlay														= "false";
+
 	/**
 	 * List of zip entries corresponding to
 	 * {@link lcsb.mapviewer.model.map.OverviewImage OverviewImage} files in the
@@ -664,6 +666,7 @@ public class ProjectBean extends AbstractManagedBean implements Serializable {
 			params.addZipEntry(submodel);
 		}
 		params.sbgnFormat("true".equalsIgnoreCase(sbgnFormat));
+		params.semanticZoom("true".equalsIgnoreCase(semanticOverlay));
 		params.networkLayoutAsDefault("true".equalsIgnoreCase(networkLayoutAsDefault));
 		projectService.createProject(params);
 		projectService.updateClassAnnotatorTreeForUser(
@@ -1485,4 +1488,21 @@ public class ProjectBean extends AbstractManagedBean implements Serializable {
 		this.newProjectOrganism = newProjectOrganism;
 	}
 
+	/**
+	 * @return the semanticOverlay
+	 * @see #semanticOverlay
+	 */
+	public String getSemanticOverlay() {
+		return semanticOverlay;
+	}
+
+	/**
+	 * @param semanticOverlay
+	 *          the semanticOverlay to set
+	 * @see #semanticOverlay
+	 */
+	public void setSemanticOverlay(String semanticOverlay) {
+		this.semanticOverlay = semanticOverlay;
+	}
+
 }
diff --git a/web/src/main/webapp/admin/projects.xhtml b/web/src/main/webapp/admin/projects.xhtml
index a036465233728e14a31fb7ed97666ede4951fb0d..ba3c03ba04460b79659a3220a86625450d5ff672 100644
--- a/web/src/main/webapp/admin/projects.xhtml
+++ b/web/src/main/webapp/admin/projects.xhtml
@@ -303,6 +303,10 @@ configurations of the source file are discussed in &lt;a href="#{request.context
       <p:selectBooleanCheckbox value="#{projectMB.networkLayoutAsDefault}" />
 			<cc:helpButton helpText='If this checkbox is checked, the default overlay in User panel will present pure network. If the checkbox is unchecked then default overlay will present pathways and compartments view.'/>	
 
+			<h:outputText value="Semantic zooming: " />
+      <p:selectBooleanCheckbox value="#{projectMB.semanticOverlay}" />
+			<cc:helpButton helpText=''/>	
+
 		</h:panelGrid>	
 		<center>
 			<p:commandButton value="Submit" icon="ui-icon-disk" actionListener="#{projectMB.createProject}" onclick="PF('addProjectDialog').hide();" update=":projectForm:projectDataTable"/>