diff --git a/console/src/main/java/lcsb/mapviewer/run/LegendGenerator.java b/console/src/main/java/lcsb/mapviewer/run/LegendGenerator.java
index 077b9a4064b56d26b2a368dbd51dfe74bc31acaa..9df1420f0ec98316d275ecea40f8b14f17fda233 100644
--- a/console/src/main/java/lcsb/mapviewer/run/LegendGenerator.java
+++ b/console/src/main/java/lcsb/mapviewer/run/LegendGenerator.java
@@ -4,6 +4,7 @@ import java.awt.Desktop;
 import java.io.File;
 import java.io.IOException;
 
+import lcsb.mapviewer.commands.CopyCommand;
 import lcsb.mapviewer.converter.ConverterParams;
 import lcsb.mapviewer.converter.InvalidInputDataExecption;
 import lcsb.mapviewer.converter.graphics.AbstractImageGenerator.Params;
@@ -29,22 +30,22 @@ public class LegendGenerator {
 	 * 
 	 */
 	private enum LegendObject {
-		/**
-		 * First legend element.
-		 */
-		LEGEND_A("testFiles/legend/legend_5_2.xml", "legend_a.png", 50, 0, 600, 480),
-		/**
-		 * Second legend element.
-		 */
-		LEGEND_B("testFiles/legend/legend_4_3.xml", "legend_b.png", 920, 0, 600, 480),
-		/**
-		 * Third legend element.
-		 */
-		LEGEND_C("testFiles/legend/legend_4_4.xml", "legend_c.png", 500, 0, 600, 480),
+//		/**
+//		 * First legend element.
+//		 */
+//		LEGEND_A("testFiles/legend/legend_5_2.xml", "legend_a.png", 50, 0, 600, 480),
+//		/**
+//		 * Second legend element.
+//		 */
+//		LEGEND_B("testFiles/legend/legend_4_3.xml", "legend_b.png", 920, 0, 600, 480),
+//		/**
+//		 * Third legend element.
+//		 */
+//		LEGEND_C("testFiles/legend/legend_4_4.xml", "legend_c.png", 500, 0, 600, 480),
 		/**
 		 * Fourth legend element.
 		 */
-		LEGEND_D("testFiles/legend/legend_4_5.xml", "legend_d.png", 500, 0, 600, 480);
+		LEGEND_D("C:/Users/piotr.gawron/Desktop/test.xml", "legend_d.png", 0, 0, 1280, 480);
 
 		/**
 		 * File with the legend data in CellDEsigner format.
@@ -157,8 +158,9 @@ public class LegendGenerator {
 		// and save it to leged.png
 		String fileName = lo.outputFile;
 
+		Model copy = new CopyCommand(model).execute();
 		PngImageGenerator generator = new PngImageGenerator(new Params()
-				.scale(ZOOM_FACTOR).x(lo.startX).y(lo.startY).width(lo.width).height(lo.height).model(model));
+				.scale(ZOOM_FACTOR).x(lo.startX).y(lo.startY).width(lo.width).height(lo.height).model(copy).level(2).semanticZoom(true));
 		generator.saveToFile(fileName);
 		Desktop.getDesktop().open(new File(fileName));
 	}
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 a1ab11fc4ad10cb3e8b74f6fb9e6b0196013f9b4..ccec089ae552859c1d2c1d97aabab79ff12d9676 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
@@ -1,6 +1,7 @@
 package lcsb.mapviewer.converter.model.celldesigner.annotation;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -21,6 +22,8 @@ import lcsb.mapviewer.common.comparator.StringSetComparator;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerElement;
+import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSpecies;
 import lcsb.mapviewer.model.map.AnnotatedObject;
 import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.model.map.MiriamRelationType;
@@ -100,25 +103,90 @@ public class RestAnnotationParser extends XmlParser {
 	 * @return note string with structural information about element
 	 */
 	public String createAnnotationString(Element element) {
-		String symbol = element.getSymbol();
-		if (symbol == null) {
-			symbol = "";
-		}
-		String name = element.getFullName();
-		if (name == null) {
-			name = "";
-		}
+		return createAnnotationString(element, false);
+	}
+
+	/**
+	 * Creates note string with structural information about element.
+	 * 
+	 * @param element
+	 *          element for which notes are created
+	 * @param forceFullInfo
+	 *          when true annotation string will contain information about empty
+	 *          fields
+	 * @return note string with structural information about element
+	 */
+	public String createAnnotationString(Element element, boolean forceFullInfo) {
+		Set<MiriamData> data = element.getMiriamData();
 		StringBuilder sb = new StringBuilder();
-		sb.append(NoteField.SYMBOL.getCommonName() + ": " + symbol + "\n");
-		sb.append(NoteField.NAME.getCommonName() + ": " + name + "\n");
-		// descrfiption will be in the string anyways so we don't need to repeat it
-		sb.append(NoteField.DESCRIPTION.getCommonName() + ": \n");
-		sb.append(NoteField.PREVIOUS_SYMBOLS.getCommonName() + ": " + StringUtils.join(element.getFormerSymbols(), ", ") + "\n");
-		sb.append(NoteField.SYNONYMS.getCommonName() + ": " + StringUtils.join(element.getSynonyms(), ", ") + "\n");
+		sb.append(createEntry(NoteField.SYMBOL, element.getSymbol(), forceFullInfo));
+		sb.append(createEntry(NoteField.NAME, element.getFullName(), forceFullInfo));
+		sb.append(createEntry(NoteField.PREVIOUS_SYMBOLS, element.getFormerSymbols(), forceFullInfo));
+		sb.append(createEntry(NoteField.SYNONYMS, element.getSynonyms(), forceFullInfo));
+		sb.append(createEntry(NoteField.HGNC, filterMiriam(data, MiriamType.HGNC), forceFullInfo));
+		sb.append(createEntry(NoteField.ENTREZ, filterMiriam(data, MiriamType.ENTREZ), forceFullInfo));
+		sb.append(createEntry(NoteField.REFSEQ, filterMiriam(data, MiriamType.REFSEQ), forceFullInfo));
+		sb.append(createEntry(NoteField.REACTOME, filterMiriam(data, MiriamType.REACTOME), forceFullInfo));
+		sb.append(createEntry(NoteField.PUBMED, filterMiriam(data, MiriamType.PUBMED), forceFullInfo));
+		sb.append(createEntry(NoteField.KEGG_GENES, filterMiriam(data, MiriamType.KEGG_GENES), forceFullInfo));
+		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.CHARGED_FORMULA, element.getFormula(), forceFullInfo));
+		if (element instanceof Species) {
+			sb.append(createEntry(NoteField.CHARGE, ((Species) element).getCharge(), forceFullInfo));
+		}
+
 		sb.append("\n");
 		return sb.toString();
 	}
 
+	private List<MiriamData> filterMiriam(Collection<MiriamData> miriamDataSet, MiriamType type) {
+		List<MiriamData> result = new ArrayList<>();
+		for (MiriamData miriamData : miriamDataSet) {
+			if (miriamData.getDataType().equals(type)) {
+				result.add(miriamData);
+			}
+		}
+		return result;
+	}
+
+	private String createEntry(NoteField type, Object value, boolean forceFullInfo) {
+		if (value == null) {
+			if (forceFullInfo) {
+				return type.getCommonName() + ": \n";
+			} else {
+				return "";
+			}
+		} else if (value instanceof String) {
+			return type.getCommonName() + ": " + value + "\n";
+		} else if (value instanceof Integer) {
+			return type.getCommonName() + ": " + value + "\n";
+		} else if (value instanceof Collection) {
+			Collection<?> collection = (Collection) value;
+			if (collection.size() > 0 || forceFullInfo) {
+				String result = "";
+				for (Object object : collection) {
+					if (!result.equals("")) {
+						result = result + ", ";
+					}
+					if (object instanceof MiriamData) {
+						result += ((MiriamData) object).getResource();
+					} else {
+						result += object;
+					}
+
+				}
+				return type.getCommonName() + ": " + result + "\n";
+			} else {
+				return "";
+			}
+		} else {
+			throw new InvalidArgumentException("Unknown class type: " + value.getClass());
+		}
+	}
+
 	/**
 	 * Returns value for the type of the structurized annotation. Structurized
 	 * annotation is in format:
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/compartment/CompartmentXmlParser.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/compartment/CompartmentXmlParser.java
index 5c51659632457f51772e78fbcb1d2b7546a0222f..80bbf90fe849da95df3d1532716d03bc06b35dd7 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/compartment/CompartmentXmlParser.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/compartment/CompartmentXmlParser.java
@@ -7,6 +7,7 @@ import org.w3c.dom.NodeList;
 import lcsb.mapviewer.common.Pair;
 import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
 import lcsb.mapviewer.converter.model.celldesigner.CellDesignerElementCollection;
+import lcsb.mapviewer.converter.model.celldesigner.annotation.RestAnnotationParser;
 import lcsb.mapviewer.converter.model.celldesigner.annotation.XmlAnnotationParser;
 import lcsb.mapviewer.converter.model.celldesigner.species.AbstractElementXmlParser;
 import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerCompartment;
@@ -26,12 +27,12 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC
 	 * Default class logger.
 	 */
 	@SuppressWarnings("unused")
-	private static Logger					logger							= Logger.getLogger(CompartmentXmlParser.class.getName());
+	private static Logger									logger							= Logger.getLogger(CompartmentXmlParser.class.getName());
 
 	/**
 	 * Parser used to retrieve Miriam data for the element.
 	 */
-	private XmlAnnotationParser		xmlAnnotationParser	= new XmlAnnotationParser();
+	private XmlAnnotationParser						xmlAnnotationParser	= new XmlAnnotationParser();
 
 	/**
 	 * Collection of {@link CellDesignerElement cell designer elements} parsed
@@ -39,6 +40,11 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC
 	 */
 	private CellDesignerElementCollection	elements;
 
+	/**
+	 * Xml parser used for processing notes into structurized data.
+	 */
+	private RestAnnotationParser					rap									= new RestAnnotationParser();
+
 	/**
 	 * Default constructor.
 	 * 
@@ -63,6 +69,8 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC
 			if (node.getNodeType() == Node.ELEMENT_NODE) {
 				if (node.getNodeName().equalsIgnoreCase("annotation")) {
 					parseAnnotationNode(compartment, node);
+				} else if (node.getNodeName().equalsIgnoreCase("notes")) {
+					compartment.setNotes(rap.getNotes(node));
 				} else {
 					throw new InvalidXmlSchemaException("Unknown element of Compartment: " + node.getNodeName());
 				}
@@ -132,8 +140,7 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC
 		sb.append("size=\"1\" ");
 		sb.append("units=\"volume\" ");
 		String parentName = "default";
-		
-		
+
 		if (compartment.getCompartment() != null && !(compartment.getCompartment() instanceof PathwayCompartment)) {
 			parentName = elements.getElementId(compartment.getCompartment());
 		}
@@ -149,6 +156,15 @@ public class CompartmentXmlParser extends AbstractElementXmlParser<CellDesignerC
 		sb.append("</celldesigner:extension>\n");
 		sb.append(xmlAnnotationParser.dataSetToXmlString(compartment.getMiriamData()));
 		sb.append("</annotation>\n");
+		sb.append("<notes>");
+		sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title/></head><body>");
+		RestAnnotationParser rap = new RestAnnotationParser();
+		sb.append(rap.createAnnotationString(compartment));
+		if (compartment.getNotes() != null) {
+			sb.append(compartment.getNotes());
+		}
+		sb.append("</body></html>");
+		sb.append("</notes>\n");
 		sb.append("</compartment>\n");
 		return sb.toString();
 	}
diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParserTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParserTest.java
index d61b82e9ce953779a6573159251e049ad34b7598..445722f2721ab372ecf8e31f9188c3822fb3551b 100644
--- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParserTest.java
+++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParserTest.java
@@ -975,4 +975,20 @@ public class CellDesignerXmlParserTest extends CellDesignerTestFunctions {
 		}
 	}
 
+	@Test
+	public void testCompartmentWithNotes() throws Exception {
+		try {
+			CellDesignerXmlParser parser = new CellDesignerXmlParser();
+			Model model = parser.createModel(new ConverterParams().filename("testFiles/compartment_with_notes.xml"));
+			model.setName(null);
+			assertNotNull(model);
+			String str = parser.toXml(model);
+			Model model2 = parser.createModel(new ConverterParams().inputStream(new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))));
+			assertEquals(0, new ModelComparator().compare(model, model2));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw e;
+		}
+	}
+
 }
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 f8ab6d2d441325298cd4f0bc6455476c01aca300..6cca1af6e56bd8d559e4375b6f6ca2a69282bba5 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
@@ -22,6 +22,7 @@ import org.w3c.dom.Node;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.CellDesignerTestFunctions;
+import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerElement;
 import lcsb.mapviewer.model.map.AnnotatedObject;
 import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.model.map.MiriamRelationType;
@@ -286,10 +287,19 @@ public class RestAnnotationParserTest extends CellDesignerTestFunctions {
 			GenericProtein element = new GenericProtein("id");
 			element.addFormerSymbol(former1);
 			element.addFormerSymbol(former2);
-			String str = rap.createAnnotationString(element);
+			element.setCharge(1);
+			String str = rap.createAnnotationString(element, true);
+			logger.debug(str);
 			assertTrue(str.contains(former1));
 			assertTrue(str.contains(former2));
 
+			for (NoteField field : NoteField.values()) {
+				if (field.getClazz().isAssignableFrom(element.getClass()) || CellDesignerElement.class.isAssignableFrom(field.getClazz())) {
+					assertTrue("Export string doesn't contain info about: " + field.getCommonName(), str.indexOf(field.getCommonName()) >= 0);
+				}
+
+			}
+
 		} catch (Exception e) {
 			e.printStackTrace();
 			throw e;
diff --git a/converter-CellDesigner/testFiles/compartment_with_notes.xml b/converter-CellDesigner/testFiles/compartment_with_notes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9dfe7f29eeea19f24a81caa36715b6073863781e
--- /dev/null
+++ b/converter-CellDesigner/testFiles/compartment_with_notes.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbml xmlns="http://www.sbml.org/sbml/level2/version4" xmlns:celldesigner="http://www.sbml.org/2001/ns/celldesigner" level="2" version="4">
+<model metaid="untitled" id="untitled">
+<annotation>
+<celldesigner:extension>
+<celldesigner:modelVersion>4.0</celldesigner:modelVersion>
+<celldesigner:modelDisplay sizeX="600" sizeY="400"/>
+<celldesigner:listOfCompartmentAliases>
+<celldesigner:compartmentAlias id="ca1" compartment="c1">
+<celldesigner:class>SQUARE</celldesigner:class>
+<celldesigner:bounds x="108.0" y="82.0" w="265.0" h="160.0"/>
+<celldesigner:namePoint x="233.0" y="205.5"/>
+<celldesigner:doubleLine thickness="12.0" outerWidth="2.0" innerWidth="1.0"/>
+<celldesigner:paint color="ffcccc00" scheme="Color"/>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:compartmentAlias>
+</celldesigner:listOfCompartmentAliases>
+<celldesigner:listOfComplexSpeciesAliases/>
+<celldesigner:listOfSpeciesAliases/>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins/>
+<celldesigner:listOfGenes/>
+<celldesigner:listOfRNAs/>
+<celldesigner:listOfAntisenseRNAs/>
+<celldesigner:listOfLayers/>
+<celldesigner:listOfBlockDiagrams/>
+</celldesigner:extension>
+</annotation>
+<listOfUnitDefinitions>
+<unitDefinition metaid="substance" id="substance" name="substance">
+<listOfUnits>
+<unit metaid="CDMT00001" kind="mole"/>
+</listOfUnits>
+</unitDefinition>
+<unitDefinition metaid="volume" id="volume" name="volume">
+<listOfUnits>
+<unit metaid="CDMT00002" kind="litre"/>
+</listOfUnits>
+</unitDefinition>
+<unitDefinition metaid="area" id="area" name="area">
+<listOfUnits>
+<unit metaid="CDMT00003" kind="metre" exponent="2"/>
+</listOfUnits>
+</unitDefinition>
+<unitDefinition metaid="length" id="length" name="length">
+<listOfUnits>
+<unit metaid="CDMT00004" kind="metre"/>
+</listOfUnits>
+</unitDefinition>
+<unitDefinition metaid="time" id="time" name="time">
+<listOfUnits>
+<unit metaid="CDMT00005" kind="second"/>
+</listOfUnits>
+</unitDefinition>
+</listOfUnitDefinitions>
+<listOfCompartments>
+<compartment metaid="default" id="default" size="1" units="volume"/>
+<compartment metaid="c1" id="c1" name="c1" size="1" units="volume" outside="default">
+<notes>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title/>
+</head>
+<body>notes
+</body>
+</html>
+</notes>
+<annotation>
+<celldesigner:extension>
+<celldesigner:name>c1</celldesigner:name>
+</celldesigner:extension>
+</annotation>
+</compartment>
+</listOfCompartments>
+</model>
+</sbml>
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 16e997154b53d5419fbf41c379f9d409dd39ac33..4841de9b38bb51a02959f7c75562d910e30384a9 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
@@ -739,7 +739,7 @@ public abstract class AbstractImageGenerator {
 		// be
 		// visible.
 
-		if (compartment.getVisibilityLevel() > level) {
+		if (compartment.getVisibilityLevel() > level && params.nested) {
 			return;
 		}
 
@@ -821,7 +821,7 @@ public abstract class AbstractImageGenerator {
 		// VisibilityLevel is big enough, then it is
 		// displayed.
 
-		if (species.getVisibilityLevel() > level) {
+		if (species.getVisibilityLevel() > level && params.nested) {
 			return;
 		}
 
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 0f3fbea1f767125d5922bbed62ae53ee300e4999..18ddccbf22573d7029c07b0229f6f48059ca165c 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
@@ -173,11 +173,9 @@ public abstract class BioEntityConverter<T extends AnnotatedObject> {
 				} else if (!isAnyReactantVisible(((Reaction) bioEntity).getReactants(), params)) {
 					result = false;
 				}
-
 			} else {
 				throw new InvalidArgumentException("Unknown class type: " + bioEntity.getClass());
 			}
-
 			return result;
 		}
 		return true;
diff --git a/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java b/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java
index ef0849c07a451034cc2d772aec92e15753b47703..b9388ab2b7cda60cdf0849a52b72dc4dc8feb366 100644
--- a/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java
+++ b/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java
@@ -384,7 +384,7 @@ public class OverviewParser {
 			try {
 				oml.setxCoord(Double.valueOf(coord.split(",")[0]));
 				oml.setyCoord(Double.valueOf(coord.split(",")[1]));
-			} catch (NumberFormatException e) {
+			} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
 				throw new InvalidCoordinatesFile("Problem with parsing coordinates in file \"" + COORDINATES_FILENAME + "\". Problematic text: \"" + coord + "\"", e);
 			}
 			try {
diff --git a/model-command/src/main/java/lcsb/mapviewer/commands/CopyCommand.java b/model-command/src/main/java/lcsb/mapviewer/commands/CopyCommand.java
index 30148865590f3bd8c3275ded92f250b0e09a7537..5ea871caf6bef7f802521ec6556f9b5c83da107a 100644
--- a/model-command/src/main/java/lcsb/mapviewer/commands/CopyCommand.java
+++ b/model-command/src/main/java/lcsb/mapviewer/commands/CopyCommand.java
@@ -176,6 +176,7 @@ public class CopyCommand extends NewModelCommand {
 			if (alias instanceof Compartment) {
 				Compartment copy = ((Compartment) alias).copy();
 				copy.getElements().clear();
+				copy.setCompartment(null);
 				result.addElement(copy);
 			}
 
@@ -184,21 +185,25 @@ public class CopyCommand extends NewModelCommand {
 		for (Element alias : model.getElements()) {
 			if (alias instanceof Species) {
 				Species copy = ((Species) alias).copy();
-				Compartment ca = copy.getCompartment();
 				copy.setCompartment(null);
-
-				// the trick is that in addAlias also some connections are added, so
-				// lets clear info about parents
-
 				result.addElement(copy);
 
-				if (ca != null) {
-					ca = result.getElementByElementId(ca.getElementId());
-					copy.setCompartment(ca);
+				Compartment parentCompartment = alias.getCompartment();
+
+				if (parentCompartment != null) {
+					parentCompartment = result.getElementByElementId(parentCompartment.getElementId());
+					copy.setCompartment(parentCompartment);
 				}
+				
 			} else if (alias instanceof Compartment) {
-				// we already added compartment alias
-				continue;
+				
+				Compartment parentCompartment = alias.getCompartment();
+
+				if (parentCompartment != null) {
+					Compartment copy = result.getElementByElementId(alias.getElementId());
+					parentCompartment = result.getElementByElementId(parentCompartment.getElementId());
+					copy.setCompartment(parentCompartment);
+				}
 			} else {
 				throw new InvalidClassException("Don't know what to do with: " + alias.getClass());
 			}
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 6b2c37080b2fecc6408d3fe18389a3cd5cbb87f7..cc78f07b6e85b9845474a31b1d1373231e774cb7 100644
--- a/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java
+++ b/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java
@@ -1,8 +1,12 @@
 package lcsb.mapviewer.commands;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.awt.geom.Point2D;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
@@ -14,8 +18,11 @@ import org.junit.Test;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.converter.ConverterParams;
 import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
+import lcsb.mapviewer.model.graphics.PolylineData;
 import lcsb.mapviewer.model.map.OverviewImage;
 import lcsb.mapviewer.model.map.OverviewModelLink;
+import lcsb.mapviewer.model.map.compartment.Compartment;
+import lcsb.mapviewer.model.map.compartment.SquareCompartment;
 import lcsb.mapviewer.model.map.layout.graphics.Layer;
 import lcsb.mapviewer.model.map.model.ElementSubmodelConnection;
 import lcsb.mapviewer.model.map.model.Model;
@@ -23,9 +30,12 @@ import lcsb.mapviewer.model.map.model.ModelComparator;
 import lcsb.mapviewer.model.map.model.ModelFullIndexed;
 import lcsb.mapviewer.model.map.model.ModelSubmodelConnection;
 import lcsb.mapviewer.model.map.model.SubmodelType;
+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.species.Element;
+import lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction;
 import lcsb.mapviewer.model.map.species.Complex;
+import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.map.species.GenericProtein;
 
 public class CopyCommandTest extends CommandTestFunctions {
@@ -311,4 +321,57 @@ public class CopyCommandTest extends CommandTestFunctions {
 		}
 	}
 
+	@Test
+	public void testCopyModelReaction() throws Exception {
+		try {
+			Model model = new ModelFullIndexed(null);
+
+			Compartment c1 = new SquareCompartment("c1");
+			Compartment c2 = new SquareCompartment("c2");
+			c1.setSemanticZoomLevelVisibility("2");
+			c2.setSemanticZoomLevelVisibility("3");
+
+			model.addElement(c1);
+			model.addElement(c2);
+
+			GenericProtein s1 = new GenericProtein("s1");
+			s1.setCompartment(c1);
+			model.addElement(s1);
+
+			GenericProtein s2 = new GenericProtein("s2");
+			s2.setCompartment(c2);
+			model.addElement(s2);
+
+			StateTransitionReaction reaction = new StateTransitionReaction();
+			Reactant reactant = new Reactant(s1);
+			reactant.setLine(new PolylineData(new Point2D.Double(0, 0), new Point2D.Double(10, 10)));
+			reaction.addReactant(reactant);
+			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");
+
+			model.addReaction(reaction);
+
+			assertTrue(s1.equals(reaction.getReactants().get(0).getElement()));
+			assertTrue(s2.equals(reaction.getProducts().get(0).getElement()));
+
+			Model model2 = new CopyCommand(model).execute();
+			Reaction reaction2 = model2.getReactions().iterator().next();
+
+			assertTrue(s1.equals(reaction.getReactants().get(0).getElement()));
+			assertTrue(s2.equals(reaction.getProducts().get(0).getElement()));
+
+			assertFalse(s1.equals(reaction2.getReactants().get(0).getElement()));
+			assertFalse(s2.equals(reaction2.getProducts().get(0).getElement()));
+
+			assertNotNull(reaction2.getReactants().get(0).getElement().getCompartment());
+			assertNotNull(reaction2.getProducts().get(0).getElement().getCompartment());
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw e;
+		}
+	}
+
 }
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 38a1265d1d95e5fab8495462665e6b87e592e897..1feda50e2c6575eb81fc83ab3f6554a4b0ba5adb 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
@@ -95,7 +95,6 @@ public class ReactionComparator implements Comparator<Reaction> {
 			return stringComparator.compare(arg0.getNotes(), arg1.getNotes());
 		}
 
-
 		if (stringComparator.compare(arg0.getIdReaction(), arg1.getIdReaction()) != 0) {
 			logger.debug("IdReaction different: " + arg0.getIdReaction() + ", " + arg1.getIdReaction());
 			return stringComparator.compare(arg0.getIdReaction(), arg1.getIdReaction());
@@ -131,6 +130,11 @@ 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());
+		}
 
 		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 386c2995adde11c9d6870a8b9b243c87ee696007..8cfbc8cc39b3c7dd6745a6ba03ecc18fafd6e91a 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
@@ -301,6 +301,7 @@ public abstract class Element implements AnnotatedObject, Serializable {
 		addMiriamData(original.getMiriamData());
 		this.abbreviation = original.getAbbreviation();
 		this.formula = original.getFormula();
+		setSemanticZoomLevelVisibility(original.getSemanticZoomLevelVisibility());
 	}
 
 	/**
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 5f57312dad2b67e5de11b5bd2a194c3bee34190a..4d6d35a87a27c1d514e467737f9eafa1d3ecd7ae 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
@@ -84,8 +84,9 @@ public class ElementComparator implements Comparator<Element> {
 	}
 
 	/**
-	 * This method compares only the fields that are defined in {@link Element} class in
-	 * inheritence tree. By the design it is called by subclass comparator.
+	 * This method compares only the fields that are defined in {@link Element}
+	 * class in inheritence tree. By the design it is called by subclass
+	 * comparator.
 	 * 
 	 * @param arg0
 	 *          first object to compare
@@ -188,6 +189,12 @@ 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/main/java/lcsb/mapviewer/model/map/species/Species.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Species.java
index 237aee82abc42b6d8ce6711067084fcf8006b1b2..62875191ca8a99293cb0a87b49e0f4069b891554 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Species.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Species.java
@@ -168,7 +168,6 @@ public abstract class Species extends Element {
 		homodimer = original.getHomodimer();
 		positionToCompartment = original.getPositionToCompartment();
 		hypothetical = original.getHypothetical();
-		setSemanticZoomLevelVisibility(original.getSemanticZoomLevelVisibility());
 
 		// don't copy reaction nodes
 	}
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 7ea08b523f44e85ed38eec4b8868694849b6e19e..a7d39db9e7bcbecef1e5d9226d0d35b3c53118c1 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
@@ -37,9 +37,9 @@ import lcsb.mapviewer.model.map.species.Species;
 
 public class ReactionTest extends ModelTestFunctions {
 
-	Logger							 logger	= Logger.getLogger(ReactantTest.class);
+	Logger					logger = Logger.getLogger(ReactantTest.class);
 
-	private Species species;
+	private Species	species;
 
 	@Before
 	public void setUp() throws Exception {
@@ -171,11 +171,7 @@ public class ReactionTest extends ModelTestFunctions {
 		try {
 			Reaction reaction1 = new Reaction();
 
-			try {
-				assertNull(reaction1.getStringType());
-				fail("Exception expected");
-			} catch (NotImplementedException e) {
-			}
+			assertNotNull(reaction1.getStringType());
 			assertNull(reaction1.getReactionRect());
 
 			int id = 61;