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 ca09d6630b632b46f85b683bd981bad5b5d7f669..97cbe2c445492fe9e1256eb6562115cb302e68d3 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
@@ -129,7 +129,7 @@ public class RestAnnotationParser extends XmlParser {
 		sb.append(createEntry(NoteField.PANTHER, filterMiriam(data, MiriamType.PANTHER), forceFullInfo));
 		sb.append(createEntry(NoteField.DESCRIPTION, null, forceFullInfo));
 		sb.append(createEntry(NoteField.ABBREVIATION, element.getAbbreviation(), forceFullInfo));
-		sb.append(createEntry(NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY, element.getSemanticZoomLevelVisibility(), forceFullInfo));
+		sb.append(createEntry(NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY, element.getVisibilityLevel(), forceFullInfo));
 		sb.append(createEntry(NoteField.CHARGED_FORMULA, element.getFormula(), forceFullInfo));
 		if (element instanceof Species) {
 			sb.append(createEntry(NoteField.CHARGE, ((Species) element).getCharge(), forceFullInfo));
@@ -640,12 +640,12 @@ public class RestAnnotationParser extends XmlParser {
 		if (zoomLevelVisibility == null) {
 			return;
 		}
-		if (element.getSemanticZoomLevelVisibility() == null) {
-			element.setSemanticZoomLevelVisibility(zoomLevelVisibility);
-		} else if (!element.getSemanticZoomLevelVisibility().equals(zoomLevelVisibility)) {
+		if (element.getVisibilityLevel() == null || element.getVisibilityLevel().isEmpty()) {
+			element.setVisibilityLevel(zoomLevelVisibility);
+		} else if (!element.getVisibilityLevel().equals(zoomLevelVisibility)) {
 			logger.warn(
 					elementUtils.getElementTag(element) + " New " + NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY.getCommonName() + " different than default ["
-							+ zoomLevelVisibility + "][" + element.getSemanticZoomLevelVisibility() + "]. Ignoring.");
+							+ zoomLevelVisibility + "][" + element.getVisibilityLevel() + "]. Ignoring.");
 		}
 	}
 
diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java
index f396388cca327cc80d47f17676da9bc3f648813b..f9d45fd607a6ecc4e8bfb6c1ce9995de66c4f6b9 100644
--- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java
+++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java
@@ -428,16 +428,22 @@ public class RestAnnotationParserTest extends CellDesignerTestFunctions {
 				}
 
 				@Override
-				public void setSemanticZoomLevelVisibility(String zoomLevelVisibility) {
+				public void setVisibilityLevel(String zoomLevelVisibility) {
 					// TODO Auto-generated method stub
-
+					
 				}
 
 				@Override
-				public String getSemanticZoomLevelVisibility() {
+				public String getVisibilityLevel() {
 					// TODO Auto-generated method stub
 					return null;
 				}
+
+				@Override
+				public void setVisibilityLevel(Integer zoomLevelVisibility) {
+					// TODO Auto-generated method stub
+					
+				}
 			});
 			fail("Exception expected");
 		} catch (NotImplementedException e) {
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 14ed133d42d6e5522f028500d8ced615c663c054..19fe2746b3875dd1d711cdb74e95291197b4587c 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,6 +17,7 @@ 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.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.converter.graphics.layer.LayerConverter;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.compartment.PathwayCompartment;
@@ -67,6 +68,7 @@ import lcsb.mapviewer.modelutils.map.ElementUtils;
  * 
  */
 public abstract class AbstractImageGenerator {
+	private SemanticZoomLevelMatcher zoomLevelMatcher		 = new SemanticZoomLevelMatcher();
 
 	/**
 	 * Model is drawn as a partial image (x,y,width,height parameters of
@@ -78,32 +80,32 @@ public abstract class AbstractImageGenerator {
 	 * TODO maybe more effecient (and safe) solution would be to include text
 	 * desciption as parts of the object border
 	 */
-	private static final int	 SINGLE_FRAME_MARGIN = 100;
+	private static final int				 SINGLE_FRAME_MARGIN = 100;
 
 	/**
 	 * On which level in hierarchical view we should visualize map.
 	 */
-	private int								 level							 = Integer.MAX_VALUE;
+	private int											 level							 = Integer.MAX_VALUE;
 
 	/**
 	 * Zoom factor of the drawing.
 	 */
-	private double						 scale							 = 1;
+	private double									 scale							 = 1;
 
 	/**
 	 * This is a frame border from which we take all elements to draw.
 	 */
-	private Rectangle2D.Double border							 = null;
+	private Rectangle2D.Double			 border							 = null;
 
 	/**
 	 * Object that helps to convert {@link ColorSchema} values into colors.
 	 */
-	private ColorExtractor		 colorExtractor			 = null;
+	private ColorExtractor					 colorExtractor			 = null;
 
 	/**
 	 * Util class for simple operations on {@link Element elements}.
 	 */
-	private ElementUtils			 eu									 = new ElementUtils();
+	private ElementUtils						 eu									 = new ElementUtils();
 
 	/**
 	 * This class contains a list of params that are used for drawing.
@@ -675,7 +677,7 @@ public abstract class AbstractImageGenerator {
 			// draw only elements that don't have parents (aren't included in any
 			// compartment/complexes)
 			if (element instanceof Species) {
-				if (((Species) element).getComplex() == null && ((Species) element).getCompartment() == null) {
+				if (((Species) element).getComplex() == null && element.getCompartment() == null) {
 					drawSpecies((Species) element, params.getVisibleLayoutsForElement(element), params);
 				}
 			}
@@ -735,7 +737,7 @@ public abstract class AbstractImageGenerator {
 		// If 'compartment' has not the big enough visibility level then should not
 		// be visible.
 
-		if (compartment.getVisibilityLevel() > level && params.nested) {
+		if (!(zoomLevelMatcher.isVisible(level, compartment.getVisibilityLevel())) && params.nested) {
 			return;
 		}
 
@@ -746,7 +748,7 @@ public abstract class AbstractImageGenerator {
 		 */
 
 		boolean fill = true;
-		if (compartment.getTransparencyLevel() <= level || !params.nested) {
+		if (zoomLevelMatcher.isTransparent(level, compartment.getTransparencyLevel()) || !params.nested) {
 			fill = false;
 		}
 
@@ -817,7 +819,7 @@ public abstract class AbstractImageGenerator {
 		// VisibilityLevel is big enough, then it is
 		// displayed.
 
-		if (species.getVisibilityLevel() > level && params.nested) {
+		if (!(zoomLevelMatcher.isVisible(level, species.getVisibilityLevel())) && params.nested) {
 			return;
 		}
 
@@ -832,10 +834,16 @@ public abstract class AbstractImageGenerator {
 
 		boolean rescale = false;
 		if (species instanceof Complex) {
-			if (((Complex) species).getElements().size() == 0) {
+			Complex complex = (Complex) species;
+			if (complex.getElements().size() == 0) {
 				rescale = true;
-			} else if (((Complex) species).getElements().get(0).getVisibilityLevel() > level) {
+			} else {
 				rescale = true;
+				for (Element child : complex.getElements()) {
+					if ((zoomLevelMatcher.isVisible(level, child.getVisibilityLevel())) || !params.nested) {
+						rescale = false;
+					}
+				}
 			}
 		}
 
@@ -862,7 +870,7 @@ public abstract class AbstractImageGenerator {
 			// mode
 			if (!complex.getState().equalsIgnoreCase("brief")) {
 				// depending on current zoom level, children are drawn or not
-				if (complex.getTransparencyLevel() <= level) {
+				if (zoomLevelMatcher.isTransparent(level, complex.getTransparencyLevel()) || !params.nested) {
 					for (Species a : complex.getElements()) {
 						drawSpecies(a, visibleLayouts, params);
 					}
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 83ea40c73472ad4b2659099afbe4484ef0b19abe..fc23fb911c173d2ef0c938e9de04531fdb171a90 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
@@ -157,7 +157,7 @@ public abstract class BioEntityConverter<T extends BioEntity> {
 	 */
 	protected boolean isVisible(BioEntity bioEntity, ConverterParams params) {
 		if (params.isSemanticZoomingOn()) {
-			boolean result = semanticZoomLevelMatcher.matchLevel(params.getLevel(), bioEntity.getSemanticZoomLevelVisibility());
+			boolean result = semanticZoomLevelMatcher.isVisible(params.getLevel(), bioEntity.getVisibilityLevel());
 			if (bioEntity instanceof Element) {
 				Compartment compartment = ((Element) bioEntity).getCompartment();
 				if (compartment != null) {
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java
index 195b6e4916344c1838861a851220c82bb323c6f6..a5c28959bc3b5294e7dfc17ecee784ebe1f10249 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java
@@ -12,7 +12,15 @@ public class SemanticZoomLevelMatcher {
 	 *          range of levels to be checked
 	 * @return true if level is in the range
 	 */
-	public boolean matchLevel(int level, String semanticZoomLevelVisibility) {
+	public boolean isVisible(int level, String semanticZoomLevelVisibility) {
+		return matchLevel(level, semanticZoomLevelVisibility);
+	}
+	
+	public boolean isTransparent(int level, String semanticZoomLevelVisibility) {
+		return matchLevel(level, semanticZoomLevelVisibility);
+	}
+
+	private boolean matchLevel(int level, String semanticZoomLevelVisibility) {
 		if (semanticZoomLevelVisibility == null || semanticZoomLevelVisibility.isEmpty()) {
 			return true;
 		}
@@ -30,5 +38,6 @@ public class SemanticZoomLevelMatcher {
 		}
 		return false;
 	}
+	
 
 }
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 555a06d3d0e4ffb5246bc36d5b137c9c9b8d79c6..842e457046c096c80786e9a2dd5370c97b18043e 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
@@ -14,6 +14,7 @@ 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;
@@ -33,56 +34,58 @@ import lcsb.mapviewer.model.map.layout.ColorSchema;
  */
 public abstract class CompartmentConverter<T extends Compartment> extends ElementConverter<T> {
 
+	private SemanticZoomLevelMatcher zoomLevelMatcher						= new SemanticZoomLevelMatcher();
+
 	/**
 	 * Default class logger.
 	 */
 	@SuppressWarnings("unused")
-	private static Logger					logger										 = Logger.getLogger(CompartmentConverter.class.getName());
+	private static Logger						 logger											= Logger.getLogger(CompartmentConverter.class.getName());
 
 	/**
 	 * Default font size.
 	 */
-	private static final int			DEFAULT_FONT_SIZE					 = 10;
+	private static final int				 DEFAULT_FONT_SIZE					= 10;
 
 	/**
 	 * Alpha level for inside of the transparent compartments.
 	 */
-	public static final int				DEFAULT_ALPHA_LEVEL				 = 8;
+	public static final int					 DEFAULT_ALPHA_LEVEL				= 8;
 
 	/**
 	 * Class used for transformation of lines.
 	 */
-	private LineTransformation		lineTransformation				 = new LineTransformation();
+	private LineTransformation			 lineTransformation					= new LineTransformation();
 
 	/**
 	 * Class used for transformation of ellipses.
 	 */
-	private EllipseTransformation	ellipseTransformation			 = new EllipseTransformation();
+	private EllipseTransformation		 ellipseTransformation			= new EllipseTransformation();
 
 	/**
 	 * Default alpha level for transparent compartments.
 	 */
-	private static int						alphaLevel								 = DEFAULT_ALPHA_LEVEL;
+	private static int							 alphaLevel									= DEFAULT_ALPHA_LEVEL;
 
 	/**
 	 * Default alpha level for semi-transparent borders.
 	 */
-	protected static final int		HIGH_ALPHA_LEVEL					 = 127;
+	protected static final int			 HIGH_ALPHA_LEVEL						= 127;
 
 	/**
 	 * Class used for finding place to draw desciption of the compartment.
 	 */
-	private PlaceFinder						placeFinder;
+	private PlaceFinder							 placeFinder;
 
 	/**
 	 * Object used for synchronization when accessing {@link #placeFinder}.
 	 */
-	private String								placeFinderSynchronization = "";
+	private String									 placeFinderSynchronization	= "";
 
 	/**
 	 * Object that helps to convert {@link ColorSchema} values into colors.
 	 */
-	private ColorExtractor				colorExtractor;
+	private ColorExtractor					 colorExtractor;
 
 	/**
 	 * Default constructor.
@@ -103,12 +106,13 @@ public abstract class CompartmentConverter<T extends Compartment> extends Elemen
 					"Dimension of the alias must be bigger than 0. Alias id: " + alias.getElementId() + " (name: \"" + alias.getName() + "\")");
 		}
 		Rectangle2D border = alias.getBorder();
-		if (params.getLevel() >= alias.getVisibilityLevel() && params.getLevel() < alias.getTransparencyLevel()) {
+		if (zoomLevelMatcher.isVisible(params.getLevel(), alias.getVisibilityLevel())
+				&& !zoomLevelMatcher.isTransparent(params.getLevel(), alias.getTransparencyLevel())) {
 			synchronized (placeFinderSynchronization) {
 				if (placeFinder == null || placeFinder.getModel() != alias.getModelData()) {
 					placeFinder = new PlaceFinder(alias.getModelData().getModel());
 				}
-				border = placeFinder.getRetangle(alias);
+				border = placeFinder.getRetangle(alias, params.getLevel());
 			}
 		} else if (!params.isTextCentered()) {
 			border = new Rectangle2D.Double(
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 345fb9394478a769db5eb1ffeee759a457a08b7f..8c36e5f603ff79e8573a724de9b509ff80fc04f4 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
@@ -13,6 +13,7 @@ import org.apache.log4j.Logger;
 
 import lcsb.mapviewer.commands.ColorExtractor;
 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;
@@ -30,20 +31,22 @@ import lcsb.mapviewer.model.map.species.Complex;
  */
 public class ComplexConverter extends SpeciesConverter<Complex> {
 
+	private SemanticZoomLevelMatcher zoomLevelMatcher			= new SemanticZoomLevelMatcher();
+
 	/**
 	 * How big is the triangle trimmed part of the complex.
 	 */
-	private static final int		TRIMMED_CORNER_SIZE	 = 5;
+	private static final int				 TRIMMED_CORNER_SIZE	= 5;
 
 	/**
 	 * Describes the distance between border of complex and internal border in
 	 * brief view (without children).
 	 */
-	private static final double	INTERNAL_BORDER_DIST = 5.0;
+	private static final double			 INTERNAL_BORDER_DIST	= 5.0;
 	/**
 	 * Default class logger.
 	 */
-	private static Logger				logger							 = Logger.getLogger(ComplexConverter.class.getName());
+	private static Logger						 logger								= Logger.getLogger(ComplexConverter.class.getName());
 
 	/**
 	 * Default constructor.
@@ -56,7 +59,6 @@ public class ComplexConverter extends SpeciesConverter<Complex> {
 		super(colorExtractor);
 	}
 
-
 	@Override
 	public void draw(final Complex alias, final Graphics2D graphics, final ConverterParams params) {
 		if (alias.getState().equalsIgnoreCase("complexnoborder")) {
@@ -145,7 +147,7 @@ public class ComplexConverter extends SpeciesConverter<Complex> {
 	@Override
 	public void drawText(final Complex alias, final Graphics2D graphics, final ConverterParams params) {
 		if (((Complex) alias).getElements().size() > 0) {
-			if (alias.getTransparencyLevel() <= params.getLevel()) {
+			if (zoomLevelMatcher.isTransparent(params.getLevel(), alias.getTransparencyLevel())) {
 				super.drawText(alias, graphics, params);
 				return;
 			}
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 73cb492d1e5dbf4873b41fb636622ca5add02b16..ce768f16013b2feffe696a480bc2b36a9e8278fc 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
@@ -21,6 +21,7 @@ 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;
@@ -39,6 +40,8 @@ import lcsb.mapviewer.model.map.species.Species;
  */
 public abstract class SpeciesConverter<T extends Species> extends ElementConverter<T> {
 
+	private SemanticZoomLevelMatcher zoomLevelMatcher			= new SemanticZoomLevelMatcher();
+
 	/**
 	 * PI value.
 	 */
@@ -301,7 +304,7 @@ public abstract class SpeciesConverter<T extends Species> extends ElementConvert
 		Point2D point = alias.getCenter();
 		if (alias instanceof Complex) {
 			if (((Complex) alias).getElements().size() > 0) {
-				if (alias.getTransparencyLevel() <= params.getLevel()) {
+				if (zoomLevelMatcher.isTransparent(params.getLevel(), alias.getTransparencyLevel())) {
 					point.setLocation(point.getX(), alias.getY() + alias.getHeight() - graphics.getFontMetrics().getAscent());
 				}
 			}
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 36d9e96928be9e69edc2c0fbf23ed1a5b1a556c8..98dc0c33be24e7eab7c870df6defb55c4edeb3d1 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,6 +8,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.species.Element;
@@ -23,6 +24,8 @@ import org.apache.log4j.Logger;
  */
 public class PlaceFinder {
 
+	private SemanticZoomLevelMatcher zoomLevelMatcher = new SemanticZoomLevelMatcher();
+
 	/**
 	 * Represents small part of the map (enclosed by cuting lines) where something
 	 * can be put. Contains borders (height, weight, location etc). Informatin if
@@ -103,52 +106,52 @@ public class PlaceFinder {
 	 * Default class logger.
 	 */
 	@SuppressWarnings("unused")
-	private static Logger												logger				= Logger.getLogger(PlaceFinder.class.getName());
+	private static Logger																	logger			 = Logger.getLogger(PlaceFinder.class.getName());
 	/**
 	 * Whole surface is split into rectangular regions. The lines that cut the
 	 * surface correspond to borders of aliases that overlap current alias. This
 	 * matrix defines which of these regions can be used for description.
 	 */
-	private Field[][]														matrix;
+	private Field[][]																			matrix;
 
 	/**
-	 * List of {@link Compartment compartment aliases} that split surface
-	 * into regions.
+	 * List of {@link Compartment compartment aliases} that split surface into
+	 * regions.
 	 */
-	private List<Compartment>							aliases;
+	private List<Compartment>															aliases;
 
 	/**
 	 * Alias for which computation is done.
 	 */
-	private Element																mainAlias;
+	private Element																				mainAlias;
 
 	/**
 	 * Left boundary of the rectangle in which we want to fit our description.
 	 */
-	private double															leftBound;
+	private double																				leftBound;
 	/**
 	 * Right boundary of the rectangle in which we want to fit our description.
 	 */
-	private double															rightBound;
+	private double																				rightBound;
 	/**
 	 * Top boundary of the rectangle in which we want to fit our description.
 	 */
-	private double															upBound;
+	private double																				upBound;
 	/**
 	 * Bottom boundary of the rectangle in which we want to fit our description.
 	 */
-	private double															bottomBound;
+	private double																				bottomBound;
 
 	/**
 	 * Model for which this {@link PlaceFinder} was created.
 	 */
-	private Model																model;
+	private Model																					model;
 
 	/**
 	 * Map with aliases that should be considered when looking for a place to put
 	 * text.
 	 */
-	private Map<Element, List<Compartment>>	otherAliases	= new HashMap<Element, List<Compartment>>();
+	private Map<Element, Map<Integer, List<Compartment>>>	otherAliases = new HashMap<>();
 
 	/**
 	 * Default constructor for place finder in a model.
@@ -342,18 +345,23 @@ public class PlaceFinder {
 	 *          alias for which we try to determine text position
 	 * @return bounds where text could be put
 	 */
-	public Rectangle2D getRetangle(Compartment alias) {
-		List<Compartment> list = otherAliases.get(alias);
+	public Rectangle2D getRetangle(Compartment alias, int level) {
+		Map<Integer, List<Compartment>> lists = otherAliases.get(alias);
+		if (lists == null) {
+			lists = new HashMap<>();
+			otherAliases.put(alias, lists);
+		}
+		List<Compartment> list = lists.get(level);
 		if (list == null) {
 			list = new ArrayList<Compartment>();
 			for (Compartment compAlias : model.getCompartments()) {
-				if (compAlias.getVisibilityLevel() <= alias.getVisibilityLevel() && compAlias.getTransparencyLevel() > alias.getVisibilityLevel()) {
+				if (zoomLevelMatcher.isVisible(level, compAlias.getVisibilityLevel()) && !zoomLevelMatcher.isTransparent(level, compAlias.getTransparencyLevel())) {
 					if (compAlias.cross(alias) && compAlias.getSize() <= alias.getSize()) {
 						list.add(compAlias);
 					}
 				}
 			}
-			otherAliases.put(alias, list);
+			lists.put(level, list);
 		}
 
 		this.mainAlias = alias;
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/NormalImageGeneratorTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/NormalImageGeneratorTest.java
index 36d84707d1901ea6c5e5a23e32f1f975708fcbef..864c939598c6397310c505a20948283409e75dc3 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/NormalImageGeneratorTest.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/NormalImageGeneratorTest.java
@@ -139,9 +139,9 @@ public class NormalImageGeneratorTest {
 			layer.addLayerText(new LayerText(new Rectangle2D.Double(100, 100, 199, 220), "Z dgf fsd aaewq ret"));
 
 			new CreateHierarchyCommand(model, 1, 8).execute();
-			model.getCompartments().get(1).setTransparencyLevel(2);
-			model.getCompartments().get(0).setTransparencyLevel(2);
-			model.getCompartments().get(3).setTransparencyLevel(2);
+			model.getCompartments().get(1).setTransparencyLevel("2");
+			model.getCompartments().get(0).setTransparencyLevel("2");
+			model.getCompartments().get(3).setTransparencyLevel("2");
 			new PngImageGenerator(new Params().level(2).scale(4).width(600).height(600).model(model).nested(true));
 
 		} catch (Exception e) {
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/PdfImageGeneratorTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/PdfImageGeneratorTest.java
index 3d191ad894e7a0dce5a02e59bb60ddef4ce733a7..6109ab544df255ee427c35ee6617615b2e3edb40 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/PdfImageGeneratorTest.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/PdfImageGeneratorTest.java
@@ -51,9 +51,9 @@ public class PdfImageGeneratorTest {
 			layer.addLayerText(new LayerText(new Rectangle2D.Double(100, 100, 199, 220), "Z dgf fsd aaewq ret"));
 
 			new CreateHierarchyCommand(model, 1, 8).execute();
-			model.getCompartments().get(1).setTransparencyLevel(2);
-			model.getCompartments().get(0).setTransparencyLevel(2);
-			model.getCompartments().get(3).setTransparencyLevel(2);
+			model.getCompartments().get(1).setTransparencyLevel("2");
+			model.getCompartments().get(0).setTransparencyLevel("2");
+			model.getCompartments().get(3).setTransparencyLevel("2");
 
 			PdfImageGenerator pig = new PdfImageGenerator(new Params().level(2).scale(4).width(600).height(600).model(model).nested(true));
 
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImplTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImplTest.java
index 8ba25ceb5b694c44954955c85a691d880e1aa439..9141204ccffd6c4e905476048376117a4ac42a6c 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImplTest.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImplTest.java
@@ -46,7 +46,7 @@ public class BioEntityConverterImplTest {
 		try {
 			Graphics2D graphics = Mockito.mock(Graphics2D.class);
 			Reaction reaction = createReaction(1.0);
-			reaction.getReactants().get(0).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getReactants().get(0).getElement().setVisibilityLevel("11");
 
 			BioEntityConverterImpl rc = new BioEntityConverterImpl(reaction, false, colorExtractor);
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
@@ -64,7 +64,7 @@ public class BioEntityConverterImplTest {
 			Graphics2D graphics = Mockito.mock(Graphics2D.class);
 
 			Reaction reaction = createReaction(1.0);
-			reaction.getProducts().get(0).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getProducts().get(0).getElement().setVisibilityLevel("11");
 
 			BioEntityConverterImpl rc = new BioEntityConverterImpl(reaction, false, colorExtractor);
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java
index 4623a640195498ae168413bdec83498a2e4ebc6b..8d17b603caea1686e012591a83ebb2663f549266 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java
@@ -280,7 +280,7 @@ public class ReactionConverterTest {
 			ReactionConverter rc = new ReactionConverter(colorExtractor);
 
 			Reaction reaction = createReaction(1.0);
-			reaction.getModifiers().get(0).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getModifiers().get(0).getElement().setVisibilityLevel("11");
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
 
 			verify(graphics, times(3)).draw(any(GeneralPath.class));
@@ -297,7 +297,7 @@ public class ReactionConverterTest {
 			ReactionConverter rc = new ReactionConverter(colorExtractor);
 
 			Reaction reaction = createReaction(1.0);
-			reaction.getReactants().get(0).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getReactants().get(0).getElement().setVisibilityLevel("11");
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
 
 			verify(graphics, times(3)).draw(any(GeneralPath.class));
@@ -314,7 +314,7 @@ public class ReactionConverterTest {
 			ReactionConverter rc = new ReactionConverter(colorExtractor);
 
 			Reaction reaction = createReaction(1.0);
-			reaction.getProducts().get(0).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getProducts().get(0).getElement().setVisibilityLevel("11");
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
 
 			verify(graphics, times(3)).draw(any(GeneralPath.class));
@@ -331,7 +331,7 @@ public class ReactionConverterTest {
 			ReactionConverter rc = new ReactionConverter(colorExtractor);
 
 			Reaction reaction = createComplexReaction(1.0);
-			reaction.getModifiers().get(0).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getModifiers().get(0).getElement().setVisibilityLevel("11");
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
 
 			verify(graphics, times(12)).draw(any(GeneralPath.class));
@@ -348,8 +348,8 @@ public class ReactionConverterTest {
 			ReactionConverter rc = new ReactionConverter(colorExtractor);
 
 			Reaction reaction = createComplexReaction(1.0);
-			reaction.getModifiers().get(0).getElement().setSemanticZoomLevelVisibility("11");
-			reaction.getModifiers().get(1).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getModifiers().get(0).getElement().setVisibilityLevel("11");
+			reaction.getModifiers().get(1).getElement().setVisibilityLevel("11");
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
 
 			verify(graphics, times(9)).draw(any(GeneralPath.class));
@@ -374,7 +374,7 @@ public class ReactionConverterTest {
 			ReactionConverter rc = new ReactionConverter(colorExtractor);
 
 			Reaction reaction = createComplexReaction(1.0);
-			reaction.getReactants().get(0).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getReactants().get(0).getElement().setVisibilityLevel("11");
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
 
 			verify(graphics, times(12)).draw(any(GeneralPath.class));
@@ -391,7 +391,7 @@ public class ReactionConverterTest {
 			ReactionConverter rc = new ReactionConverter(colorExtractor);
 
 			Reaction reaction = createComplexReaction(1.0);
-			reaction.getProducts().get(0).getElement().setSemanticZoomLevelVisibility("11");
+			reaction.getProducts().get(0).getElement().setVisibilityLevel("11");
 			rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10));
 
 			verify(graphics, times(12)).draw(any(GeneralPath.class));
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/placefinder/AllPlaceFinderTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/placefinder/AllPlaceFinderTest.java
index 2ddcd62d38d4e161878bfb94e9a1adb9356f5e18..de5f85db2360c05e79b0353be6b4ff59d9642744 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/placefinder/AllPlaceFinderTest.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/placefinder/AllPlaceFinderTest.java
@@ -31,7 +31,7 @@ public class AllPlaceFinderTest {
 
 		for (Compartment alias : model.getCompartments()) {
 			PlaceFinder pf = new PlaceFinder(model);
-			actual = pf.getRetangle(alias).toString();
+			actual = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel())).toString();
 		}
 		String expected = "";
 		Rectangle2D result = model.getCompartments().get(0).getBorder();
@@ -49,7 +49,7 @@ public class AllPlaceFinderTest {
 		String expected = "";
 		for (Compartment alias : model.getCompartments()) {
 			PlaceFinder pf = new PlaceFinder(model);
-			actual = pf.getRetangle(alias).toString();
+			actual = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel())).toString();
 			Rectangle2D result = alias.getBorder();
 			expected = result.toString();
 			assertEquals(expected, actual);
@@ -65,7 +65,7 @@ public class AllPlaceFinderTest {
 		model.addElement(alias2);
 
 		PlaceFinder pf = new PlaceFinder(model);
-		Rectangle2D rect = pf.getRetangle(alias2);
+		Rectangle2D rect = pf.getRetangle(alias2, Integer.valueOf(alias.getVisibilityLevel()));
 		double actual = rect.getWidth() * rect.getHeight();
 		double expected = alias2.getWidth() * alias2.getHeight();
 		assertTrue(actual < expected);
@@ -79,7 +79,7 @@ public class AllPlaceFinderTest {
 		double actual = 0.0;
 		for (Compartment alias : model.getCompartments()) {
 			PlaceFinder pf = new PlaceFinder(model);
-			Rectangle2D rect = pf.getRetangle(alias);
+			Rectangle2D rect = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel()));
 			actual = rect.getWidth() * rect.getHeight();
 			assertTrue(actual > 0);
 		}
@@ -95,7 +95,7 @@ public class AllPlaceFinderTest {
 		Rectangle2D result = null;
 		for (Compartment alias : model.getCompartments()) {
 			PlaceFinder pf = new PlaceFinder(model);
-			Rectangle2D rect = pf.getRetangle(alias);
+			Rectangle2D rect = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel()));
 			actual += rect.getWidth() * rect.getHeight();
 		}
 		result = model.getCompartments().get(0).getBorder();
@@ -124,8 +124,8 @@ public class AllPlaceFinderTest {
 		result.setY(y);
 		result.setWidth(width);
 		result.setHeight(height);
-		result.setTransparencyLevel(10);
-		result.setVisibilityLevel(9);
+		result.setTransparencyLevel("10");
+		result.setVisibilityLevel("9");
 
 		return result;
 	}
@@ -138,7 +138,7 @@ public class AllPlaceFinderTest {
 		double actual = 0.0;
 		for (Compartment alias : model.getCompartments()) {
 			PlaceFinder pf = new PlaceFinder(model);
-			Rectangle2D rect = pf.getRetangle(alias);
+			Rectangle2D rect = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel()));
 			actual = rect.getWidth() * rect.getHeight();
 			assertTrue(actual > 0);
 		}
diff --git a/model-command/src/main/java/lcsb/mapviewer/commands/CreateHierarchyCommand.java b/model-command/src/main/java/lcsb/mapviewer/commands/CreateHierarchyCommand.java
index 23a0107febab2705e9c1c62dfce16dc2cf1327b5..4ef03758409d66635419947aaa92775596d2e8a3 100644
--- a/model-command/src/main/java/lcsb/mapviewer/commands/CreateHierarchyCommand.java
+++ b/model-command/src/main/java/lcsb/mapviewer/commands/CreateHierarchyCommand.java
@@ -203,7 +203,7 @@ public class CreateHierarchyCommand extends ModelCommand {
 					logValue = zoomLevels;
 				}
 			}
-			alias.setVisibilityLevel(logValue);
+			alias.setVisibilityLevel(logValue + "");
 		}
 	}
 
@@ -218,7 +218,7 @@ public class CreateHierarchyCommand extends ModelCommand {
 		double rate = computeRate(compartment, Configuration.MAX_VISIBLE_OBJECT_SIZE);
 		maxVisibilityLevel = (int) ((int) Math.ceil(Math.log(rate)) / LOG_4);
 		for (Element child : compartment.getElements()) {
-			maxVisibilityLevel = Math.min(maxVisibilityLevel, child.getVisibilityLevel());
+			maxVisibilityLevel = Math.min(maxVisibilityLevel, Integer.valueOf(child.getVisibilityLevel()));
 		}
 		if (maxVisibilityLevel >= zoomLevels) {
 			maxVisibilityLevel = zoomLevels;
@@ -226,7 +226,7 @@ public class CreateHierarchyCommand extends ModelCommand {
 		if (maxVisibilityLevel <= 0) {
 			maxVisibilityLevel = 1;
 		}
-		compartment.setTransparencyLevel(maxVisibilityLevel);
+		compartment.setTransparencyLevel(maxVisibilityLevel + "");
 		for (Element child : compartment.getElements()) {
 			child.setVisibilityLevel(compartment.getTransparencyLevel());
 		}
@@ -243,7 +243,7 @@ public class CreateHierarchyCommand extends ModelCommand {
 		double rate = computeRate(complex, Configuration.MAX_VISIBLE_OBJECT_SIZE);
 		maxVisibilityLevel = (int) ((int) Math.ceil(Math.log(rate)) / LOG_4);
 		for (Element child : complex.getElements()) {
-			maxVisibilityLevel = Math.min(maxVisibilityLevel, child.getVisibilityLevel());
+			maxVisibilityLevel = Math.min(maxVisibilityLevel, Integer.valueOf(child.getVisibilityLevel()));
 		}
 		if (maxVisibilityLevel >= zoomLevels) {
 			maxVisibilityLevel = zoomLevels;
@@ -251,7 +251,7 @@ public class CreateHierarchyCommand extends ModelCommand {
 		if (maxVisibilityLevel <= 0) {
 			maxVisibilityLevel = 1;
 		}
-		complex.setTransparencyLevel(maxVisibilityLevel);
+		complex.setTransparencyLevel(maxVisibilityLevel + "");
 		for (Element child : complex.getElements()) {
 			child.setVisibilityLevel(complex.getTransparencyLevel());
 		}
@@ -270,7 +270,7 @@ public class CreateHierarchyCommand extends ModelCommand {
 			} else if (alias instanceof Complex) {
 				settingTransparencyLevelForComplex((Complex) alias);
 			} else {
-				alias.setTransparencyLevel(0);
+				alias.setTransparencyLevel("0");
 			}
 		}
 	}
diff --git a/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java b/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java
index cc78f07b6e85b9845474a31b1d1373231e774cb7..6ff5608d3cc46fafcfa79118f2217a9c9badac07 100644
--- a/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java
+++ b/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java
@@ -328,8 +328,8 @@ public class CopyCommandTest extends CommandTestFunctions {
 
 			Compartment c1 = new SquareCompartment("c1");
 			Compartment c2 = new SquareCompartment("c2");
-			c1.setSemanticZoomLevelVisibility("2");
-			c2.setSemanticZoomLevelVisibility("3");
+			c1.setVisibilityLevel("2");
+			c2.setVisibilityLevel("3");
 
 			model.addElement(c1);
 			model.addElement(c2);
@@ -349,7 +349,7 @@ public class CopyCommandTest extends CommandTestFunctions {
 			Product product = new Product(s2);
 			product.setLine(new PolylineData(new Point2D.Double(10, 0), new Point2D.Double(120, 10)));
 			reaction.addProduct(product);
-			reaction.setSemanticZoomLevelVisibility("4");
+			reaction.setVisibilityLevel("4");
 
 			model.addReaction(reaction);
 
diff --git a/model-command/src/test/java/lcsb/mapviewer/commands/CreateHierarchyCommandTest.java b/model-command/src/test/java/lcsb/mapviewer/commands/CreateHierarchyCommandTest.java
index 4d733b555e86dd03627f2cc685471b0855d642aa..97eb95a6f99283ae3bffc29295bf0cdd4f7837f6 100644
--- a/model-command/src/test/java/lcsb/mapviewer/commands/CreateHierarchyCommandTest.java
+++ b/model-command/src/test/java/lcsb/mapviewer/commands/CreateHierarchyCommandTest.java
@@ -53,7 +53,7 @@ public class CreateHierarchyCommandTest extends CommandTestFunctions {
 				parents.add(alias);
 			}
 
-			Set<Integer> levels = new HashSet<Integer>();
+			Set<String> levels = new HashSet<>();
 			for (Element a : model.getElements()) {
 				levels.add(a.getVisibilityLevel());
 			}
@@ -150,16 +150,16 @@ public class CreateHierarchyCommandTest extends CommandTestFunctions {
 
 			for (Compartment compartment : model.getCompartments()) {
 				if (compartment.getCompartment() == null) {
+					int visibilityLevel = Integer.valueOf(compartment.getVisibilityLevel());
 					assertTrue(
-							"Alias " + compartment.getElementId() + " is not visible at levels highers than " + compartment.getVisibilityLevel(),
-							compartment.getVisibilityLevel() <= 1);
+							"Alias " + compartment.getElementId() + " is not visible at levels highers than " + compartment.getVisibilityLevel(), visibilityLevel <= 1);
 				}
 			}
 
 			for (Species species : model.getSpeciesList()) {
 				if (species.getCompartment() == null) {
-					assertTrue(
-							"Alias " + species.getElementId() + " is not visible at levels highers than " + species.getVisibilityLevel(), species.getVisibilityLevel() <= 1);
+					int visibilityLevel = Integer.valueOf(species.getVisibilityLevel());
+					assertTrue("Alias " + species.getElementId() + " is not visible at levels highers than " + species.getVisibilityLevel(), visibilityLevel <= 1);
 				}
 			}
 
@@ -179,10 +179,11 @@ public class CreateHierarchyCommandTest extends CommandTestFunctions {
 
 			new CreateHierarchyCommand(model, levels, zoomFactor).execute();
 
-			for (Element alias : model.getElements()) {
+			for (Element element : model.getElements()) {
+				int visibilityLevel = Integer.valueOf(element.getVisibilityLevel());
 				assertTrue(
-						"Alias " + alias.getElementId() + " is not visible even at the bottom level (visibility: " + alias.getVisibilityLevel() + ") ",
-						alias.getVisibilityLevel() <= levels);
+						"Alias " + element.getElementId() + " is not visible even at the bottom level (visibility: " + element.getVisibilityLevel() + ") ",
+						visibilityLevel <= levels);
 			}
 
 		} catch (Exception e) {
@@ -262,12 +263,16 @@ public class CreateHierarchyCommandTest extends CommandTestFunctions {
 			for (Element alias : model.getElements()) {
 				Element parentAlias = alias.getCompartment();
 				if (parentAlias != null) {
-					assertTrue(alias.getVisibilityLevel() >= parentAlias.getVisibilityLevel());
+					int parentVisibilityLevel = Integer.valueOf(parentAlias.getVisibilityLevel());
+					int aliasVisibilityLevel = Integer.valueOf(alias.getVisibilityLevel());
+					assertTrue(aliasVisibilityLevel >= parentVisibilityLevel);
 				}
 				if (alias instanceof Species) {
 					parentAlias = ((Species) alias).getComplex();
 					if (parentAlias != null) {
-						assertTrue(alias.getVisibilityLevel() >= parentAlias.getVisibilityLevel());
+						int parentVisibilityLevel = Integer.valueOf(parentAlias.getVisibilityLevel());
+						int aliasVisibilityLevel = Integer.valueOf(alias.getVisibilityLevel());
+						assertTrue(aliasVisibilityLevel >= parentVisibilityLevel);
 					}
 				}
 			}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/BioEntity.java b/model/src/main/java/lcsb/mapviewer/model/map/BioEntity.java
index eb2f82d237feca3a737cbd430daa07b20f32b919..b5aa17cc9bceed8fafc97fb1cf4b85203dc308f2 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/BioEntity.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/BioEntity.java
@@ -145,12 +145,20 @@ public interface BioEntity extends Serializable {
 	 * @param zoomLevelVisibility
 	 *          semantic zoom level visibility
 	 */
-	void setSemanticZoomLevelVisibility(String zoomLevelVisibility);
+	void setVisibilityLevel(String zoomLevelVisibility);
+	
+	/**
+	 * Sets semantic zoom level visibility.
+	 * 
+	 * @param zoomLevelVisibility
+	 *          semantic zoom level visibility
+	 */
+	void setVisibilityLevel(Integer zoomLevelVisibility);
 
 	/**
 	 * Returns semantic zoom level visibility.
 	 * 
 	 * @return semantic zoom level visibility
 	 */
-	String getSemanticZoomLevelVisibility();
+	String getVisibilityLevel();
 }
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/reaction/Reaction.java b/model/src/main/java/lcsb/mapviewer/model/map/reaction/Reaction.java
index 6a2fafcf6bb5a2aca158bbbe0b628a33c065461a..13cd8e3dc2d6d0a98985e01f9b3463d61d0227b4 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/reaction/Reaction.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/reaction/Reaction.java
@@ -183,7 +183,7 @@ public class Reaction implements BioEntity {
 	/**
 	 * Zoom level visibility for semantic zooming.
 	 */
-	private String													 zoomLevelVisibility;
+	private String													 visibilityLevel					 = "";
 
 	/**
 	 * Lists of all synonyms used for describing this element.
@@ -253,7 +253,7 @@ public class Reaction implements BioEntity {
 		for (String synonym : original.getSynonyms()) {
 			synonyms.add(synonym);
 		}
-		setSemanticZoomLevelVisibility(original.getSemanticZoomLevelVisibility());
+		setVisibilityLevel(original.getVisibilityLevel());
 
 	}
 
@@ -411,20 +411,14 @@ public class Reaction implements BioEntity {
 		return "Generic Reaction";
 	}
 
-	/**
-	 * Returns visibility level of the reaction in hierarchical view. More
-	 * information about hierarchical view can be found in
-	 * {@link lcsb.mapviewer.converter.graphics.AbstractImageGenerator
-	 * AbstractImageGenerator}.
-	 * 
-	 * @return visibility level of the reaction
-	 */
-	public int getVisibilityLevel() {
-		int level = 0;
-		for (ReactionNode node : getReactionNodes()) {
-			level = Math.max(level, node.getElement().getVisibilityLevel());
-		}
-		return level;
+	@Override
+	public String getVisibilityLevel() {
+		return visibilityLevel;
+	}
+
+	@Override
+	public void setVisibilityLevel(String visibilityLevel) {
+		this.visibilityLevel = visibilityLevel;
 	}
 
 	/**
@@ -874,13 +868,13 @@ public class Reaction implements BioEntity {
 	}
 
 	@Override
-	public String getSemanticZoomLevelVisibility() {
-		return zoomLevelVisibility;
-	}
+	public void setVisibilityLevel(Integer zoomLevelVisibility) {
+		if (zoomLevelVisibility == null) {
+			this.visibilityLevel = null;
+		} else {
+			this.visibilityLevel = zoomLevelVisibility + "";
+		}
 
-	@Override
-	public void setSemanticZoomLevelVisibility(String zoomLevelVisibility) {
-		this.zoomLevelVisibility = zoomLevelVisibility;
 	}
 
 }
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java
index 1feda50e2c6575eb81fc83ab3f6554a4b0ba5adb..a4061e784ece8bd4de2a74faca9af258e41dad3c 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java
@@ -130,10 +130,9 @@ public class ReactionComparator implements Comparator<Reaction> {
 			logger.debug("GeneProteinReaction different: " + arg0.getGeneProteinReaction() + ", " + arg1.getGeneProteinReaction());
 			return stringComparator.compare(arg0.getGeneProteinReaction(), arg1.getGeneProteinReaction());
 		}
-		if (stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()) != 0) {
-			logger.debug(
-					"SemanticZoomLevelVisibility different: \"" + arg0.getSemanticZoomLevelVisibility() + "\", \"" + arg1.getSemanticZoomLevelVisibility() + "\"");
-			return stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility());
+		if (stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()) != 0) {
+			logger.debug("SemanticZoomLevelVisibility different: \"" + arg0.getVisibilityLevel() + "\", \"" + arg1.getVisibilityLevel() + "\"");
+			return stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel());
 		}
 
 		IntegerComparator integerComparator = new IntegerComparator();
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
index 01688104f11e53210eee5b9d377ef7f33ae4e006..0d419f263fe5b3cb618b46707f5e4738bcdf3b13 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
@@ -174,7 +174,7 @@ public abstract class Element implements BioEntity, Serializable {
 	 * @see lcsb.mapviewer.converter.graphics.AbstractImageGenerator.Params#level
 	 *      AbstractImageGenerator.Params#level
 	 */
-	private int															visibilityLevel;
+	private String													visibilityLevel		 = "";
 
 	/**
 	 * From which level element should be transparent.
@@ -182,7 +182,7 @@ public abstract class Element implements BioEntity, Serializable {
 	 * @see #visibilityLevel
 	 * @see AbstractImageGenerator.Params#level
 	 */
-	private int															transparencyLevel;
+	private String													transparencyLevel	 = "";
 
 	/**
 	 * List of search indexes that describe this element.
@@ -214,11 +214,6 @@ public abstract class Element implements BioEntity, Serializable {
 	 */
 	private String													fullName;
 
-	/**
-	 * Zoom level visibility for semantic zooming.
-	 */
-	private String													zoomLevelVisibility;
-
 	/**
 	 * Abbreviation associated with the element.
 	 */
@@ -282,7 +277,6 @@ public abstract class Element implements BioEntity, Serializable {
 		width = original.getWidth();
 		height = original.getHeight();
 		fontSize = original.getFontSize();
-		visibilityLevel = original.getVisibilityLevel();
 		color = original.getColor();
 		for (SearchIndex searchIndex : original.getSearchIndexes()) {
 			searchIndexes.add(searchIndex.copy());
@@ -301,7 +295,8 @@ public abstract class Element implements BioEntity, Serializable {
 		addMiriamData(original.getMiriamData());
 		this.abbreviation = original.getAbbreviation();
 		this.formula = original.getFormula();
-		setSemanticZoomLevelVisibility(original.getSemanticZoomLevelVisibility());
+		setVisibilityLevel(original.getVisibilityLevel());
+		setTransparencyLevel(original.getTransparencyLevel());
 	}
 
 	/**
@@ -325,7 +320,6 @@ public abstract class Element implements BioEntity, Serializable {
 		width = 0.0;
 		height = 0.0;
 		fontSize = DEFAULT_FONT_SIZE;
-		visibilityLevel = 0;
 		color = Color.white;
 	}
 
@@ -661,23 +655,25 @@ public abstract class Element implements BioEntity, Serializable {
 		this.elementId = elementId;
 	}
 
-	/**
-	 * @return the visibilityLevel
-	 * @see #visibilityLevel
-	 */
-	public int getVisibilityLevel() {
+	@Override
+	public String getVisibilityLevel() {
 		return visibilityLevel;
 	}
 
-	/**
-	 * @param visibilityLevel
-	 *          the visibilityLevel to set
-	 * @see #visibilityLevel
-	 */
-	public void setVisibilityLevel(int visibilityLevel) {
+	@Override
+	public void setVisibilityLevel(String visibilityLevel) {
 		this.visibilityLevel = visibilityLevel;
 	}
 
+	@Override
+	public void setVisibilityLevel(Integer visibilityLevel) {
+		if (visibilityLevel == null) {
+			this.visibilityLevel = null;
+		} else {
+			this.visibilityLevel = visibilityLevel + "";
+		}
+	}
+
 	/**
 	 * @return the model
 	 * @see #model
@@ -755,7 +751,7 @@ public abstract class Element implements BioEntity, Serializable {
 	 * @return the transparencyLevel
 	 * @see #transparencyLevel
 	 */
-	public int getTransparencyLevel() {
+	public String getTransparencyLevel() {
 		return transparencyLevel;
 	}
 
@@ -764,7 +760,7 @@ public abstract class Element implements BioEntity, Serializable {
 	 *          the transparencyLevel to set
 	 * @see #transparencyLevel
 	 */
-	public void setTransparencyLevel(int transparencyLevel) {
+	public void setTransparencyLevel(String transparencyLevel) {
 		this.transparencyLevel = transparencyLevel;
 	}
 
@@ -1092,14 +1088,4 @@ public abstract class Element implements BioEntity, Serializable {
 		dataMining.setElement(this);
 	}
 
-	@Override
-	public void setSemanticZoomLevelVisibility(String zoomLevelVisibility) {
-		this.zoomLevelVisibility = zoomLevelVisibility;
-	}
-
-	@Override
-	public String getSemanticZoomLevelVisibility() {
-		return this.zoomLevelVisibility;
-	}
-
 }
\ No newline at end of file
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
index 4d6d35a87a27c1d514e467737f9eafa1d3ecd7ae..a462b0538a649343670dab32c89c2862997da132 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
@@ -140,9 +140,9 @@ public class ElementComparator implements Comparator<Element> {
 			return doubleComparator.compare(arg0.getFontSize(), arg1.getFontSize());
 		}
 
-		if (integerComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()) != 0) {
+		if (stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()) != 0) {
 			logger.debug("Visibility level different: " + arg0.getVisibilityLevel() + ", " + arg1.getVisibilityLevel());
-			return integerComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel());
+			return stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel());
 		}
 
 		if (integerComparator.compare(arg0.getColor().getRGB(), arg1.getColor().getRGB()) != 0) {
@@ -189,12 +189,6 @@ public class ElementComparator implements Comparator<Element> {
 			return stringComparator.compare(arg0.getFormula(), arg1.getFormula());
 		}
 
-		if (stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()) != 0) {
-			logger.debug(
-					"SemanticZoomLevelVisibility different: \"" + arg0.getSemanticZoomLevelVisibility() + "\", \"" + arg1.getSemanticZoomLevelVisibility() + "\"");
-			return stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility());
-		}
-
 		StringSetComparator stringSetComparator = new StringSetComparator();
 		StringListComparator stringListComparator = new StringListComparator();
 
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/compartment/CompartmentComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/compartment/CompartmentComparatorTest.java
index 7f4a97b6ba7aa1d77b9c8449063b86c101c1ca20..3df3ef0c801f092b454fb9b6c0f2ccf5a1067403 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/compartment/CompartmentComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/compartment/CompartmentComparatorTest.java
@@ -117,7 +117,7 @@ public class CompartmentComparatorTest {
 		result.setHeight(5);
 		result.setFontSize(9.0);
 		result.setColor(Color.BLUE);
-		result.setVisibilityLevel(14);
+		result.setVisibilityLevel("14");
 		result.setThickness(998);
 		result.setOuterWidth(45);
 		result.setInnerWidth(65);
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java b/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java
index a7d39db9e7bcbecef1e5d9226d0d35b3c53118c1..36bbc7596e415ae3634f1080a0e734fb2ca7d990 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java
@@ -229,15 +229,10 @@ public class ReactionTest extends ModelTestFunctions {
 	public void testVisibilityLevel() {
 		try {
 			Reaction reaction1 = new Reaction();
-			assertEquals(0, reaction1.getVisibilityLevel());
-
-			Reactant reactant = new Reactant();
-			Element protein = new GenericProtein("id_xyz");
-			protein.setVisibilityLevel(2);
-			reactant.setElement(protein);
-			reaction1.addReactant(reactant);
-
-			assertEquals(2, reaction1.getVisibilityLevel());
+			assertEquals(null, reaction1.getVisibilityLevel());
+			
+			reaction1.setVisibilityLevel(1);
+			assertEquals("1", reaction1.getVisibilityLevel());
 		} catch (Exception e) {
 			e.printStackTrace();
 			throw e;
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/ComplexComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/ComplexComparatorTest.java
index 651379e21f9f04acf89d8eaaeec58922d52add9f..907dfeeef5ca93a46aa8d67aea5dd8934cdda857 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/ComplexComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/ComplexComparatorTest.java
@@ -56,7 +56,7 @@ public class ComplexComparatorTest {
 		result.setHeight(5);
 		result.setFontSize(9.0);
 		result.setColor(Color.BLUE);
-		result.setVisibilityLevel(14);
+		result.setVisibilityLevel("14");
 
 		Species protein = new GenericProtein("S");
 		protein.setName("a");
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java
index 78ee89782a7464f5f967829c38667379c3e628e7..540521afd217b44962885bf4db98f4d3226cd586 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java
@@ -145,7 +145,7 @@ public class ElementTest extends ModelTestFunctions {
 			Set<MiriamData> miriamData = new HashSet<>();
 			Compartment compartment = new Compartment("idd");
 			int id = 72;
-			int transparencyLevel = 2;
+			String transparencyLevel = "2";
 			Model model = new ModelFullIndexed(modelData);
 			List<SearchIndex> indexes = new ArrayList<>();
 			indexes.add(new SearchIndex());
diff --git a/persist/src/db/11/fix_db_20170628.sql b/persist/src/db/11/fix_db_20170628.sql
new file mode 100644
index 0000000000000000000000000000000000000000..6f033cadda30017e2c61c7140b918ae90da80c29
--- /dev/null
+++ b/persist/src/db/11/fix_db_20170628.sql
@@ -0,0 +1,8 @@
+-- semantic zooming
+alter table element_table drop column zoomlevelvisibility ;
+alter table reaction_table drop column zoomlevelvisibility ;
+
+ALTER TABLE element_table ALTER COLUMN visibilitylevel TYPE character varying;
+ALTER TABLE element_table ALTER COLUMN transparencylevel TYPE character varying;
+
+alter table reaction_table add column visibilitylevel character varying default null;
\ No newline at end of file
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 ae8fcff5f13ee70d55bbf096d32dcb6fc20a01ae..c502dcc85378075d9e2bc4b94073a383e1d8b59c 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -662,10 +662,10 @@ public class ProjectService implements IProjectService {
 		int level = Integer.valueOf(levelStr);
 		Model output = new CopyCommand(model).execute();
 		for (BioEntity bioEntity : output.getAnnotatedObjects()) {
-			if (matcher.matchLevel(level, bioEntity.getSemanticZoomLevelVisibility())) {
-				bioEntity.setSemanticZoomLevelVisibility(null);
+			if (matcher.isVisible(level, bioEntity.getVisibilityLevel())) {
+				bioEntity.setVisibilityLevel("0");
 			} else {
-				bioEntity.setSemanticZoomLevelVisibility(Integer.MAX_VALUE + "");
+				bioEntity.setVisibilityLevel(Integer.MAX_VALUE + "");
 			}
 		}
 		return output;
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 35f74ed3cc4ac6d82f9f43deed678eb75a5468d3..e4898431923acb28d1ecc1aaec65dd33de348946 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java
@@ -18,6 +18,7 @@ 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;
@@ -64,6 +65,8 @@ import lcsb.mapviewer.services.utils.SearchIndexer;
 @Transactional(value = "txManager")
 public class SearchService implements ISearchService {
 
+	private SemanticZoomLevelMatcher							zoomLevelMatcher					 = new SemanticZoomLevelMatcher();
+
 	/**
 	 * Prefix used in search by name interface to limit results only to species.
 	 */
@@ -447,7 +450,7 @@ public class SearchService implements ISearchService {
 		if (params.getLevel() == null || params.getLayoutIdentfier() == null) {
 			return true;
 		}
-		return (!params.isNested()) || alias.getVisibilityLevel() <= params.getLevel();
+		return (!params.isNested()) || zoomLevelMatcher.isVisible(params.getLevel(), alias.getVisibilityLevel());
 	}
 
 	@Override
diff --git a/service/src/main/java/lcsb/mapviewer/services/search/data/FullAliasView.java b/service/src/main/java/lcsb/mapviewer/services/search/data/FullAliasView.java
index 10edf3b3656fcfa9f6055bef5af272e0310727b4..3fdec74966cd3d723b2b40340ada9cd3328cb9d2 100644
--- a/service/src/main/java/lcsb/mapviewer/services/search/data/FullAliasView.java
+++ b/service/src/main/java/lcsb/mapviewer/services/search/data/FullAliasView.java
@@ -147,7 +147,7 @@ public class FullAliasView extends LightAliasView implements IHeavyView {
 	 */
 	private Integer							 initialAmount				= null;
 
-	private Integer							 visibilityLevel			= null;
+	private String							 visibilityLevel			= null;
 
 	/**
 	 * Initial concentration of species.
@@ -617,15 +617,16 @@ public class FullAliasView extends LightAliasView implements IHeavyView {
 	 * @return the visibilityLevel
 	 * @see #visibilityLevel
 	 */
-	public Integer getVisibilityLevel() {
+	public String getVisibilityLevel() {
 		return visibilityLevel;
 	}
 
 	/**
-	 * @param visibilityLevel the visibilityLevel to set
+	 * @param visibilityLevel
+	 *          the visibilityLevel to set
 	 * @see #visibilityLevel
 	 */
-	public void setVisibilityLevel(Integer visibilityLevel) {
+	public void setVisibilityLevel(String visibilityLevel) {
 		this.visibilityLevel = visibilityLevel;
 	}
 }
diff --git a/service/src/main/java/lcsb/mapviewer/services/search/data/FullReactionView.java b/service/src/main/java/lcsb/mapviewer/services/search/data/FullReactionView.java
index 31dbe84374e1c1d63d20da2f1329f567b461e519..94ed82542ee2bb43daf8b65f6903adcd8f39b7fa 100644
--- a/service/src/main/java/lcsb/mapviewer/services/search/data/FullReactionView.java
+++ b/service/src/main/java/lcsb/mapviewer/services/search/data/FullReactionView.java
@@ -126,7 +126,7 @@ public class FullReactionView extends LightReactionView implements IHeavyView {
 	 */
 	private Map<String, Object>	 other										 = new HashMap<>();
 
-	private Integer							 visibilityLevel					 = null;
+	private String							 visibilityLevel					 = null;
 
 	/**
 	 * Default constructor with localization passed in the argument.
@@ -426,7 +426,7 @@ public class FullReactionView extends LightReactionView implements IHeavyView {
 	 * @return the visibilityLevel
 	 * @see #visibilityLevel
 	 */
-	public Integer getVisibilityLevel() {
+	public String getVisibilityLevel() {
 		return visibilityLevel;
 	}
 
@@ -434,7 +434,7 @@ public class FullReactionView extends LightReactionView implements IHeavyView {
 	 * @param visibilityLevel the visibilityLevel to set
 	 * @see #visibilityLevel
 	 */
-	public void setVisibilityLevel(Integer visibilityLevel) {
+	public void setVisibilityLevel(String visibilityLevel) {
 		this.visibilityLevel = visibilityLevel;
 	}