diff --git a/commons/pom.xml b/commons/pom.xml
index 5874d03b056716a978a4974e4516c718749e064b..92f50c5630c2faac555ca47ddb9755c1e83500d4 100644
--- a/commons/pom.xml
+++ b/commons/pom.xml
@@ -22,6 +22,11 @@
 			<artifactId>commons-io</artifactId>
 			<version>${commons-io.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-text</artifactId>
+			<version>${apache.commons-text.version}</version>
+		</dependency>
 		<dependency>
 			<groupId>org.apache.commons</groupId>
 			<artifactId>commons-lang3</artifactId>
diff --git a/commons/src/main/java/lcsb/mapviewer/common/Comparator.java b/commons/src/main/java/lcsb/mapviewer/common/Comparator.java
index 92102ccf029363a97198e3e0cda7bb9b01141917..ed0446f4017c16bc13baf7f35c0efb21acbc4aaf 100644
--- a/commons/src/main/java/lcsb/mapviewer/common/Comparator.java
+++ b/commons/src/main/java/lcsb/mapviewer/common/Comparator.java
@@ -49,6 +49,7 @@ public abstract class Comparator<T extends Object> implements java.util.Comparat
       }
       return internalCompare(arg0, arg1);
     } else {
+      logger.debug("Class different: " + arg0.getClass() + "; " + arg1.getClass());
       return -1;
     }
   }
diff --git a/commons/src/main/java/lcsb/mapviewer/common/XmlParser.java b/commons/src/main/java/lcsb/mapviewer/common/XmlParser.java
index a6d9f1f72195de50940341398df56b19c958602a..0d5ab74603a074c3ba1b4dab1a38ad7b8d920a6e 100644
--- a/commons/src/main/java/lcsb/mapviewer/common/XmlParser.java
+++ b/commons/src/main/java/lcsb/mapviewer/common/XmlParser.java
@@ -21,7 +21,7 @@ import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.text.StringEscapeUtils;
 import org.apache.log4j.Logger;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
@@ -416,7 +416,7 @@ public class XmlParser {
       return null;
     }
     // quite expensive
-    return StringEscapeUtils.escapeXml(string).replaceAll("\n", "&#10;").replace("\r", "&#13;");
+    return StringEscapeUtils.escapeXml10(string).replaceAll("\n", "&#10;").replace("\r", "&#13;");
   }
 
   public List<Node> getAllNotNecessirellyDirectChild(String tagName, Node root) {
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerAntisenseRna.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerAntisenseRna.java
index 9ad77efd72744ef067410592b646760e63baed5d..09a7fc88fc612c38c3fb8389b7b50e42c027de80 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerAntisenseRna.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerAntisenseRna.java
@@ -5,10 +5,16 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.structure.fields.CellDesignerModificationResidue;
 import lcsb.mapviewer.model.map.species.AntisenseRna;
+import lcsb.mapviewer.model.map.species.Gene;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
 
 /**
  * Class representing CellDesigner {@link AntisenseRna}.
@@ -140,9 +146,19 @@ public class CellDesignerAntisenseRna extends CellDesignerSpecies<AntisenseRna>
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(Species species) {
+    AntisenseRna antisenseRna = (AntisenseRna) species;
     for (CellDesignerModificationResidue region : regions) {
-      ((AntisenseRna) element).addRegion(region.createModificationResidue(element));
+      ModificationResidue mr = region.createModificationResidue(antisenseRna);
+      if (mr instanceof CodingRegion) {
+        antisenseRna.addCodingRegion((CodingRegion) mr);
+      } else if (mr instanceof ModificationSite) {
+        antisenseRna.addModificationSite((ModificationSite) mr);
+      } else if (mr instanceof ProteinBindingDomain) {
+        antisenseRna.addProteinBindingDomain((ProteinBindingDomain) mr);
+      } else {
+        throw new InvalidArgumentException("Cannot add modification residue to element: " + mr.getClass());
+      }
     }
   }
 
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerCompartment.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerCompartment.java
index c502500383a2e016d7c102f3d5e0467cfa6a07ab..77f8d8a7a4a9bf0e5efe35b8699c9b78d26c1848 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerCompartment.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerCompartment.java
@@ -149,8 +149,4 @@ public class CellDesignerCompartment extends CellDesignerElement<Compartment>
     return result;
   }
 
-  @Override
-  public void updateModelElementAfterLayoutAdded(Compartment element) {
-  }
-
 }
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerElement.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerElement.java
index 5f2bf1910863679b298741261a0a5815d317322d..55548200389d25432925ef386d9284d9fbbe5144 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerElement.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerElement.java
@@ -429,8 +429,6 @@ public abstract class CellDesignerElement<T extends Element> implements Serializ
    */
   public abstract T createModelElement(String modelElementId);
 
-  public abstract void updateModelElementAfterLayoutAdded(T element);
-
   /**
    * Sets values from this cell designer structure into model object.
    * 
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java
index 247887c598d8437f530e4c81b3fe885603c8975f..5d83e67eab62a02f5fd58fe6c0d7e6b00e30fa80 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java
@@ -3,10 +3,18 @@ package lcsb.mapviewer.converter.model.celldesigner.structure;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.log4j.Logger;
+
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.structure.fields.CellDesignerModificationResidue;
 import lcsb.mapviewer.model.map.species.Gene;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.RegulatoryRegion;
+import lcsb.mapviewer.model.map.species.field.TranscriptionSite;
 
 /**
  * Class representing CellDesigner {@link Gene}.
@@ -15,6 +23,11 @@ import lcsb.mapviewer.model.map.species.Species;
  * 
  */
 public class CellDesignerGene extends CellDesignerSpecies<Gene> {
+  /**
+   * Default class logger.
+   */
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(CellDesignerGene.class);
 
   /**
    * 
@@ -113,10 +126,21 @@ public class CellDesignerGene extends CellDesignerSpecies<Gene> {
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(Species species) {
+    Gene gene = (Gene) species;
     for (CellDesignerModificationResidue region : modificationResidues) {
-      ((Gene) element).addModificationResidue(region.createModificationResidue(element));
+      ModificationResidue mr = region.createModificationResidue(gene);
+      if (mr instanceof CodingRegion) {
+        gene.addCodingRegion((CodingRegion) mr);
+      } else if (mr instanceof ModificationSite) {
+        gene.addModificationSite((ModificationSite) mr);
+      } else if (mr instanceof RegulatoryRegion) {
+        gene.addRegulatoryRegion((RegulatoryRegion) mr);
+      } else if (mr instanceof TranscriptionSite) {
+        gene.addTranscriptionSite((TranscriptionSite) mr);
+      } else {
+        throw new InvalidArgumentException("Cannot add modification residue to element: " + mr.getClass());
+      }
     }
   }
-
 }
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerProtein.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerProtein.java
index 9fa15ca0dff3c18c82d4db90de02094f23bda405..08420d031d2699700bde7ab379d102cc30fda3a0 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerProtein.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerProtein.java
@@ -5,10 +5,14 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.structure.fields.CellDesignerModificationResidue;
 import lcsb.mapviewer.model.map.species.Protein;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.BindingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.Residue;
 
 /**
  * Class representing CellDesigner {@link Protein} object.
@@ -150,9 +154,17 @@ public class CellDesignerProtein<T extends Protein> extends CellDesignerSpecies<
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
-    for (CellDesignerModificationResidue mr : modificationResidues) {
-      ((Protein) element).addModificationResidue(mr.createModificationResidue(element));
+  public void updateModelElementAfterLayoutAdded(Species species) {
+    Protein protein= (Protein) species;
+    for (CellDesignerModificationResidue region : modificationResidues) {
+      ModificationResidue mr = region.createModificationResidue(protein);
+      if (mr instanceof Residue) {
+        protein.addResidue((Residue) mr);
+      } else if (mr instanceof BindingRegion) {
+        protein.addBindingRegion((BindingRegion) mr);
+      } else {
+        throw new InvalidArgumentException("Cannot add modification residue to element: " + mr.getClass());
+      }
     }
   }
 
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerRna.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerRna.java
index 64e121ad9a3dd26675334a8e62feb267e7a1b0a2..10392b74ac7b448feb1553231fa050c3a005abad 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerRna.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerRna.java
@@ -5,10 +5,15 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.model.celldesigner.structure.fields.CellDesignerModificationResidue;
 import lcsb.mapviewer.model.map.species.Rna;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
 
 /**
  * Class representing CellDesigner {@link Rna}.
@@ -139,10 +144,19 @@ public class CellDesignerRna extends CellDesignerSpecies<Rna> {
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(Species species) {
+    Rna rna = (Rna) species;
     for (CellDesignerModificationResidue region : regions) {
-      Rna rna = (Rna) element;
-      rna.addRegion(region.createModificationResidue(rna));
+      ModificationResidue mr = region.createModificationResidue(rna);
+      if (mr instanceof CodingRegion) {
+        rna.addCodingRegion((CodingRegion) mr);
+      } else if (mr instanceof ModificationSite) {
+        rna.addModificationSite((ModificationSite) mr);
+      } else if (mr instanceof ProteinBindingDomain) {
+        rna.addProteinBindingDomain((ProteinBindingDomain) mr);
+      } else {
+        throw new InvalidArgumentException("Cannot add modification residue to element: " + mr.getClass());
+      }
     }
   }
 
diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerSpecies.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerSpecies.java
index 9decf2eaf8cfdf7d2601e6f2509482aab443fe17..58a84bd10ab3a616dbdcb15e9c4bb8a40390ce6b 100644
--- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerSpecies.java
+++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerSpecies.java
@@ -540,7 +540,6 @@ public class CellDesignerSpecies<T extends Species> extends CellDesignerElement<
     this.constant = constant;
   }
 
-  @Override
   public void updateModelElementAfterLayoutAdded(Species element) {
   }
 
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 ef8ee5eb57546748d8ea574917e8363b7af34fe6..2cefdb5ec198f1385754e9538e8bde15ea3a2ca7 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
@@ -449,8 +449,7 @@ public class CellDesignerXmlParserTest extends CellDesignerTestFunctions {
 
       assertNotNull(model2);
 
-      ModelComparator comparator = new ModelComparator();
-      assertEquals(0, comparator.compare(model, model2));
+      assertTrue(model2.getNotes() == null || model2.getNotes().isEmpty());
     } catch (Exception e) {
       e.printStackTrace();
       throw e;
diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/species/GeneXmlParserTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/species/GeneXmlParserTest.java
index ed2aa793014903e58f1e4daa7e90b4ec78e7e24d..bdc11d6cca90bc2b2cafcdacc68c6384a04123f6 100644
--- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/species/GeneXmlParserTest.java
+++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/species/GeneXmlParserTest.java
@@ -90,7 +90,7 @@ public class GeneXmlParserTest extends CellDesignerTestFunctions {
   public void testParsePhosphorylatedGene() throws Exception {
     try {
       Model model = getModelForFile("testFiles/problematic/phosphorylated_gene.xml");
-      Gene gene = (Gene) model.getElementByElementId("sa1");
+      Gene gene = model.getElementByElementId("sa1");
       assertEquals(1, gene.getModificationResidues().size());
       ModificationSite residue = (ModificationSite) gene.getModificationResidues().get(0);
       assertEquals(ModificationState.PHOSPHORYLATED, residue.getState());
diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/structure/SpeciesStateTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/structure/SpeciesStateTest.java
index 5e24aa5ddb18578a19104fcb598e0a3daee9e618..1c6e9ca880ad90b3979c7287ca06d1cfff6045fa 100644
--- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/structure/SpeciesStateTest.java
+++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/structure/SpeciesStateTest.java
@@ -56,7 +56,7 @@ public class SpeciesStateTest {
     rna.setHeight(10);
     CodingRegion mr = new CodingRegion();
     mr.setPosition(new Point2D.Double(10, 40));
-    rna.addRegion(mr);
+    rna.addCodingRegion(mr);
     SpeciesState state = new SpeciesState(rna);
     assertEquals(1, state.getModifications().size());
   }
@@ -68,7 +68,7 @@ public class SpeciesStateTest {
     gene.setHeight(10);
     ModificationSite mr = new ModificationSite();
     mr.setPosition(new Point2D.Double(10, 40));
-    gene.addModificationResidue(mr);
+    gene.addModificationSite(mr);
     SpeciesState state = new SpeciesState(gene);
     assertEquals(1, state.getModifications().size());
   }
diff --git a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java
index ee8b701a4e731ca7fdf5eb785acd43fe049ef506..ffdc1fdfc09fae44b22cb99b17a76fb617488a72 100644
--- a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java
+++ b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java
@@ -15,7 +15,7 @@ import java.nio.charset.StandardCharsets;
 import javax.xml.bind.JAXBException;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.text.StringEscapeUtils;
 import org.apache.log4j.Logger;
 import org.apache.log4j.spi.LoggingEvent;
 import org.sbgn.SbgnUtil;
@@ -74,7 +74,7 @@ public class SbgnmlXmlConverter implements IConverter {
             throw new ConverterException("problematic output sbgn. Cannot find map tag");
           }
           String notesNode = "<notes><html:body xmlns:html=\"http://www.w3.org/1999/xhtml\">" +
-              StringEscapeUtils.escapeXml(notes.toString()) + "\n</html:body></notes> ";
+              StringEscapeUtils.escapeXml10(notes.toString()) + "\n</html:body></notes> ";
           xml = xml.substring(0, position) + notesNode + xml.substring(position, xml.length());
         }
         result = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
diff --git a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParser.java b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParser.java
index 7c6c5e53d52912687a33cfebb0affa922f2b66a1..3be28e7f95923df93507b594e50d8401aa755fb1 100644
--- a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParser.java
+++ b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParser.java
@@ -831,7 +831,7 @@ public class SbgnmlXmlParser {
 
     mr.setPosition(new Point2D.Double(x, y));
 
-    protein.addModificationResidue(mr);
+    protein.addResidue(mr);
   }
 
   /**
diff --git a/converter-SBGNML/src/test/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParserTest2.java b/converter-SBGNML/src/test/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParserTest2.java
index fd00fea41cba0e4b087597edf4a3563cea2b383b..e14f56980f96d1c3fab13eb7acab1ed807017fab 100644
--- a/converter-SBGNML/src/test/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParserTest2.java
+++ b/converter-SBGNML/src/test/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlParserTest2.java
@@ -33,7 +33,7 @@ public class SbgnmlXmlParserTest2 {
     Residue mr = new Residue();
     Point2D position = new Point2D.Double(100, 20);
     mr.setPosition(position);
-    protein.addModificationResidue(mr);
+    protein.addResidue(mr);
     parser.adjustModificationCoordinates(protein);
 
     assertTrue(mr.getPosition().distance(position) > Configuration.EPSILON);
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverterTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverterTest.java
index 9b1ec5616f6490f6b6eae2da279f0be88628bdfc..d44d12eefa6f4a8162467e4debc206eb89ff566c 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverterTest.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverterTest.java
@@ -197,7 +197,7 @@ public class SpeciesConverterTest {
       bindingRegion.setPosition(new Point2D.Double(10, 10));
       bindingRegion.setWidth(100.0);
       bindingRegion.setHeight(10.0);
-      protein.addModificationResidue(bindingRegion);
+      protein.addBindingRegion(bindingRegion);
 
       ProteinConverter converter = Mockito.spy(new ProteinConverter(colorExtractor));
       converter.drawModification(bindingRegion, graphics, false);
diff --git a/converter-sbml/pom.xml b/converter-sbml/pom.xml
index 92fec0b1eb8f7d7f16ae8c84f0f953d676e3c08f..f3c2a5ec22b5b2701bb9a7124504455306fe9d89 100644
--- a/converter-sbml/pom.xml
+++ b/converter-sbml/pom.xml
@@ -104,7 +104,7 @@
 					<groupId>commons-logging</groupId>
 					<artifactId>commons-logging</artifactId>
 				</exclusion>
-			<!-- https://github.com/sbmlteam/jsbml/issues/156 -->
+				<!-- https://github.com/sbmlteam/jsbml/issues/156 -->
 				<exclusion>
 					<groupId>org.sbml.jsbml</groupId>
 					<artifactId>jsbml-core</artifactId>
@@ -153,6 +153,12 @@
 			<scope>test</scope>
 		</dependency>
 
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-text</artifactId>
+			<version>${apache.commons-text.version}</version>
+		</dependency>
+		
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/NotesUtility.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/NotesUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f2b00aa02466b613d84eefbc2a552062acfe72e
--- /dev/null
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/NotesUtility.java
@@ -0,0 +1,63 @@
+package lcsb.mapviewer.converter.model.sbml;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.commons.text.StringEscapeUtils;
+import org.sbml.jsbml.AbstractNamedSBase;
+
+import lcsb.mapviewer.converter.InvalidInputDataExecption;
+
+/**
+ * This utility class parses notes from SBML node and prepares escaped string
+ * ready to use in SBML.
+ * 
+ * @author Piotr Gawron
+ *
+ */
+public class NotesUtility {
+
+  /**
+   * Extract notes from SBML node
+   * 
+   * @param sbmlElement
+   *          SBML node
+   * @return notes
+   * @throws InvalidInputDataExecption
+   *           thrown when there is problem with extracting notes
+   */
+  public static String extractNotes(AbstractNamedSBase sbmlElement) throws InvalidInputDataExecption {
+    String notes = "";
+    try {
+      notes = sbmlElement.getNotesString();
+    } catch (XMLStreamException e) {
+      throw new InvalidInputDataExecption(sbmlElement.getId() + " Invalid notes", e);
+    }
+    if (sbmlElement.getNotes() != null) {
+      if (sbmlElement.getNotes().getChildCount() > 1) {
+        if (sbmlElement.getNotes().getChild(1).getChildCount() > 1) {
+          if (sbmlElement.getNotes().getChild(1).getChild(1).getChildCount() > 0) {
+            notes = sbmlElement.getNotes().getChild(1).getChild(1).getChild(0).getCharacters();
+          } else {
+            notes = sbmlElement.getNotes().getChild(1).getChild(1).getCharacters();
+          }
+        }
+      }
+    }
+    return notes;
+  }
+
+  /**
+   * Prepares escaped xml string with notes.
+   * 
+   * @param notes
+   *          notes to be processed
+   * @return escaped xml string with notes
+   */
+  public static String prepareEscapedXmlNotes(String notes) {
+    if (notes == null) {
+      return "";
+    }
+    return StringEscapeUtils.escapeXml10(notes);
+  }
+
+}
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java
index 190a2bb028a68693626e4e0b417a5ce4fbd42246..546d8e83f32fe95f4883b39aca7323916fe69a8f 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java
@@ -3,15 +3,19 @@ package lcsb.mapviewer.converter.model.sbml;
 import java.awt.Color;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import javax.xml.stream.XMLStreamException;
 
-import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.log4j.Logger;
 import org.sbml.jsbml.Model;
+import org.sbml.jsbml.ext.SBasePlugin;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
 import org.sbml.jsbml.ext.layout.Layout;
+import org.sbml.jsbml.ext.layout.LayoutModelPlugin;
+import org.sbml.jsbml.ext.multi.MultiModelPlugin;
 import org.sbml.jsbml.ext.render.ColorDefinition;
 import org.sbml.jsbml.ext.render.LocalRenderInformation;
 import org.sbml.jsbml.ext.render.LocalStyle;
@@ -28,11 +32,24 @@ import lcsb.mapviewer.model.map.InconsistentModelException;
 
 public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.sbml.jsbml.AbstractNamedSBase>
     extends XmlParser {
-  Logger logger = Logger.getLogger(SbmlBioEntityExporter.class);
-
+  /**
+   * Default class logger.
+   */
+  private Logger logger = Logger.getLogger(SbmlBioEntityExporter.class);
+
+  /**
+   * SBML Layout used when exporting map.
+   */
   private Layout layout;
 
+  /**
+   * Map that we are exporting.
+   */
   private lcsb.mapviewer.model.map.model.Model minervaModel;
+
+  /**
+   * SBML model to which we are exporting.
+   */
   private Model sbmlModel;
 
   private Map<String, S> sbmlElementByElementId = new HashMap<>();
@@ -42,13 +59,17 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s
 
   private int idCounter = 0;
 
-  public SbmlBioEntityExporter(Layout sbmlLayout, lcsb.mapviewer.model.map.model.Model minervaModel) {
-    this.layout = sbmlLayout;
+  private Set<SbmlExtension> sbmlExtensions = new HashSet<>();
+
+  public SbmlBioEntityExporter(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel,
+      Collection<SbmlExtension> sbmlExtensions) {
+    this.sbmlModel = sbmlModel;
+    this.layout = getLayout(sbmlModel);
     this.minervaModel = minervaModel;
+    this.sbmlExtensions.addAll(sbmlExtensions);
   }
 
-  public void exportElements(Model model) throws InconsistentModelException {
-    sbmlModel = model;
+  public void exportElements() throws InconsistentModelException {
     Collection<T> speciesList = getElementList();
     for (T species : speciesList) {
       S sbmlElement = getSbmlElement(species);
@@ -58,12 +79,25 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s
       }
       sbmlElementByElementId.put(species.getElementId(), sbmlElement);
     }
-    for (T species : speciesList) {
-      AbstractReferenceGlyph elementGlyph = createGlyph(species);
-      sbmlGlyphByElementId.put(species.getElementId(), elementGlyph);
+    if (isExtensionEnabled(SbmlExtension.LAYOUT)) {
+      for (T species : speciesList) {
+        AbstractReferenceGlyph elementGlyph = createGlyph(species);
+        sbmlGlyphByElementId.put(species.getElementId(), elementGlyph);
+      }
     }
   }
 
+  /**
+   * Checks if exporter should used extension.
+   * 
+   * @param sbmlExtension
+   *          {@link SbmlExtension} to be checked
+   * @return <code>true</code> if extension should be supported by exported file
+   */
+  protected boolean isExtensionEnabled(SbmlExtension sbmlExtension) {
+    return sbmlExtensions.contains(sbmlExtension);
+  }
+
   protected abstract Collection<T> getElementList();
 
   public abstract S createSbmlElement(T element) throws InconsistentModelException;
@@ -81,7 +115,7 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s
       }
       sbmlElement.setName(element.getName());
       try {
-        sbmlElement.setNotes(StringEscapeUtils.escapeXml(element.getNotes()));
+        sbmlElement.setNotes(NotesUtility.prepareEscapedXmlNotes(element.getNotes()));
       } catch (XMLStreamException e) {
         throw new InvalidStateException(e);
       }
@@ -108,35 +142,48 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s
     return (idCounter++) + "";
   }
 
-  protected Model getSbmlModel() {
-    return sbmlModel;
-  }
-
-  protected void setSbmlModel(Model sbmlModel) {
-    this.sbmlModel = sbmlModel;
+  private Layout getLayout(org.sbml.jsbml.Model sbmlModel) {
+    Layout layout = null;
+
+    if (sbmlModel.getExtensionCount() > 0) {
+      for (SBasePlugin plugin : sbmlModel.getExtensionPackages().values()) {
+        if (plugin.getClass().equals(org.sbml.jsbml.ext.layout.LayoutModelPlugin.class)) {
+          LayoutModelPlugin layoutPlugin = (LayoutModelPlugin) plugin;
+          if (layoutPlugin.getLayoutCount() == 0) {
+            logger.warn("Layout plugin available but no layouts defined");
+          } else if (layoutPlugin.getLayoutCount() > 1) {
+            logger.warn(layoutPlugin.getLayoutCount() + " layouts defined. Using first one.");
+            layout = layoutPlugin.getLayout(0);
+          } else {
+            layout = layoutPlugin.getLayout(0);
+          }
+        }
+      }
+    }
+    return layout;
   }
 
   protected Layout getLayout() {
     return layout;
   }
 
-  protected void setLayout(Layout layout) {
-    this.layout = layout;
-  }
-
   protected RenderLayoutPlugin getRenderPlugin() {
-    if (layout.getExtensionCount() > 0) {
-      return (RenderLayoutPlugin) layout.getExtension("render");
+    if (getLayout().getExtensionCount() > 0) {
+      return (RenderLayoutPlugin) getLayout().getExtension("render");
     }
     return null;
   }
 
+  protected MultiModelPlugin getMultiPlugin() {
+    return (MultiModelPlugin) sbmlModel.getExtension("multi");
+  }
+
   protected lcsb.mapviewer.model.map.model.Model getMinervaModel() {
     return minervaModel;
   }
 
-  protected void setMinervaModel(lcsb.mapviewer.model.map.model.Model minervaModel) {
-    this.minervaModel = minervaModel;
+  protected Model getSbmlModel() {
+    return sbmlModel;
   }
 
   public S getSbmlElementByElementId(String id) {
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityParser.java
index 4e95639007f8f21f9519b7534b66b6d9e177c5d8..a133d04110417daf243a2e813663986cc74c728c 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityParser.java
@@ -6,12 +6,13 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
-import javax.xml.stream.XMLStreamException;
-
 import org.apache.log4j.Logger;
 import org.sbml.jsbml.AbstractNamedSBase;
 import org.sbml.jsbml.Annotation;
+import org.sbml.jsbml.ext.SBasePlugin;
 import org.sbml.jsbml.ext.layout.Layout;
+import org.sbml.jsbml.ext.layout.LayoutModelPlugin;
+import org.sbml.jsbml.ext.multi.MultiModelPlugin;
 import org.sbml.jsbml.ext.render.LocalRenderInformation;
 import org.sbml.jsbml.ext.render.LocalStyle;
 import org.sbml.jsbml.ext.render.RenderLayoutPlugin;
@@ -24,18 +25,49 @@ import lcsb.mapviewer.converter.annotation.XmlAnnotationParser;
 import lcsb.mapviewer.converter.model.sbml.species.ElementColorEnum;
 import lcsb.mapviewer.model.map.BioEntity;
 import lcsb.mapviewer.model.map.MiriamData;
+import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.species.Element;
 
 public class SbmlBioEntityParser extends XmlParser {
-  Logger logger = Logger.getLogger(SbmlBioEntityParser.class);
 
-  protected Layout layout;
-  protected lcsb.mapviewer.model.map.model.Model minervaModel;
+  /**
+   * Default class logger.
+   */
+  private static Logger logger = Logger.getLogger(SbmlBioEntityParser.class);
+
+  /**
+   * SBML layout attached to parsed {@link #sbmlModel}.
+   */
+  private Layout layout;
+
+  /**
+   * SBML model that we will parse;
+   */
+  private org.sbml.jsbml.Model sbmlModel;
+
+  /**
+   * Our model to which we parse data.
+   */
+  private lcsb.mapviewer.model.map.model.Model minervaModel;
 
+  /**
+   * Counter for identifiers that cannot be inferred from SBML.
+   */
   private int idCounter = 0;
 
-  public SbmlBioEntityParser() {
+  /**
+   * Default constructor.
+   * 
+   * @param sbmlModel
+   *          SBML model that we are parsing
+   * @param minervaModel
+   *          Minerva model to which we are extracting data
+   */
+  public SbmlBioEntityParser(org.sbml.jsbml.Model sbmlModel, Model minervaModel) {
     super();
+    this.sbmlModel = sbmlModel;
+    this.minervaModel = minervaModel;
+    this.layout = getSbmlLayout(sbmlModel);
   }
 
   protected Set<MiriamData> parseAnnotation(Annotation annotation) throws InvalidInputDataExecption {
@@ -61,7 +93,7 @@ public class SbmlBioEntityParser extends XmlParser {
     if (result.getName() == null || result.getName().isEmpty()) {
       result.setName(result.getElementId());
     }
-    String notes = extractNotes(sbmlElement);
+    String notes = NotesUtility.extractNotes(sbmlElement);
     result.setNotes(notes);
 
     if (result instanceof Element) {
@@ -70,27 +102,6 @@ public class SbmlBioEntityParser extends XmlParser {
     }
   }
 
-  private String extractNotes(AbstractNamedSBase sbmlElement) throws InvalidInputDataExecption {
-    String notes = "";
-    try {
-      notes = sbmlElement.getNotesString();
-    } catch (XMLStreamException e) {
-      throw new InvalidInputDataExecption(sbmlElement.getId() + " Invalid notes", e);
-    }
-    if (sbmlElement.getNotes() != null) {
-      if (sbmlElement.getNotes().getChildCount() > 1) {
-        if (sbmlElement.getNotes().getChild(1).getChildCount() > 1) {
-          if (sbmlElement.getNotes().getChild(1).getChild(1).getChildCount() > 0) {
-            notes = sbmlElement.getNotes().getChild(1).getChild(1).getChild(0).getCharacters();
-          } else {
-            notes = sbmlElement.getNotes().getChild(1).getChild(1).getCharacters();
-          }
-        }
-      }
-    }
-    return notes;
-  }
-
   protected String getNextId() {
     return (idCounter++) + "";
   }
@@ -158,4 +169,41 @@ public class SbmlBioEntityParser extends XmlParser {
     return styleById.get(string);
   }
 
+  protected lcsb.mapviewer.model.map.model.Model getMinervaModel() {
+    return minervaModel;
+  }
+
+  protected org.sbml.jsbml.Model getSbmlModel() {
+    return sbmlModel;
+  }
+
+  protected Layout getLayout() {
+    return layout;
+  }
+
+  private Layout getSbmlLayout(org.sbml.jsbml.Model sbmlModel) {
+    Layout layout = null;
+
+    if (sbmlModel.getExtensionCount() > 0) {
+      for (SBasePlugin plugin : sbmlModel.getExtensionPackages().values()) {
+        if (plugin.getClass().equals(org.sbml.jsbml.ext.layout.LayoutModelPlugin.class)) {
+          LayoutModelPlugin layoutPlugin = (LayoutModelPlugin) plugin;
+          if (layoutPlugin.getLayoutCount() == 0) {
+            logger.warn("Layout plugin available but no layouts defined");
+          } else if (layoutPlugin.getLayoutCount() > 1) {
+            logger.warn(layoutPlugin.getLayoutCount() + " layouts defined. Using first one.");
+            layout = layoutPlugin.getLayout(0);
+          } else {
+            layout = layoutPlugin.getLayout(0);
+          }
+        }
+      }
+    }
+    return layout;
+  }
+
+  protected MultiModelPlugin getMultiPlugin() {
+    return (MultiModelPlugin) sbmlModel.getExtension("multi");
+  }
+
 }
\ No newline at end of file
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementExporter.java
index 4a4db0e0817b9a721a7cce99ed792ec6f7e59b94..f7c76e9eaa11536becff6706d3b3a4e073e5e7d9 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementExporter.java
@@ -1,10 +1,12 @@
 package lcsb.mapviewer.converter.model.sbml;
 
+import java.util.Collection;
+
 import org.apache.log4j.Logger;
+import org.sbml.jsbml.Model;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
 import org.sbml.jsbml.ext.layout.BoundingBox;
 import org.sbml.jsbml.ext.layout.Dimensions;
-import org.sbml.jsbml.ext.layout.Layout;
 import org.sbml.jsbml.ext.layout.Point;
 import org.sbml.jsbml.ext.render.ColorDefinition;
 import org.sbml.jsbml.ext.render.LocalStyle;
@@ -13,10 +15,16 @@ import lcsb.mapviewer.model.map.species.Element;
 
 public abstract class SbmlElementExporter<T extends Element, S extends org.sbml.jsbml.Symbol>
     extends SbmlBioEntityExporter<T, S> {
-  Logger logger = Logger.getLogger(SbmlElementExporter.class);
 
-  public SbmlElementExporter(Layout sbmlLayout, lcsb.mapviewer.model.map.model.Model minervaModel) {
-    super(sbmlLayout, minervaModel);
+  /**
+   * Default class logger.
+   */
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(SbmlElementExporter.class);
+
+  public SbmlElementExporter(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel,
+      Collection<SbmlExtension> sbmlExtensions) {
+    super(sbmlModel, minervaModel, sbmlExtensions);
   }
 
   protected void assignLayoutToGlyph(T element, AbstractReferenceGlyph speciesGlyph) {
@@ -29,11 +37,14 @@ public abstract class SbmlElementExporter<T extends Element, S extends org.sbml.
     boundingBox.setDimensions(dimensions);
     speciesGlyph.setBoundingBox(boundingBox);
 
-    LocalStyle style = createStyle(element);
-    ColorDefinition color = getColorDefinition(element.getColor());
-    style.getGroup().setFill(color.getId());
+    if (isExtensionEnabled(SbmlExtension.RENDER)) {
+      LocalStyle style = createStyle(element);
+      ColorDefinition color = getColorDefinition(element.getColor());
+      style.getGroup().setFill(color.getId());
+      style.getGroup().setFontSize(element.getFontSize().shortValue());
 
-    assignStyleToGlyph(speciesGlyph, style);
+      assignStyleToGlyph(speciesGlyph, style);
+    }
 
   }
 
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java
index fd13c6671c7220751eaeaf06d8b701c1083967be..46bad68534a8612417b603b256a9d2825d0e2b27 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java
@@ -12,7 +12,6 @@ import org.apache.log4j.Logger;
 import org.sbml.jsbml.ListOf;
 import org.sbml.jsbml.Model;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
-import org.sbml.jsbml.ext.layout.Layout;
 import org.sbml.jsbml.ext.render.LocalStyle;
 import org.sbml.jsbml.ext.render.RenderConstants;
 import org.sbml.jsbml.ext.render.RenderGraphicalObjectPlugin;
@@ -22,17 +21,20 @@ import lcsb.mapviewer.converter.InvalidInputDataExecption;
 import lcsb.mapviewer.model.map.species.Element;
 
 public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends SbmlBioEntityParser {
-  Logger logger = Logger.getLogger(SbmlElementParser.class);
 
-  public SbmlElementParser(Layout sbmlLayout, lcsb.mapviewer.model.map.model.Model minervaModel) {
-    this.layout = sbmlLayout;
-    this.minervaModel = minervaModel;
+  /**
+   * Default class logger.
+   */
+  private Logger logger = Logger.getLogger(SbmlElementParser.class);
+
+  public SbmlElementParser(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel) {
+    super(sbmlModel, minervaModel);
   }
 
-  public List<Element> parseList(Model sbmlModel) throws InvalidInputDataExecption {
+  public List<Element> parseList() throws InvalidInputDataExecption {
     List<Element> result = new ArrayList<>();
-    for (T sbmlElement : getSbmlElementList(sbmlModel)) {
-      Element element = parse(sbmlElement, sbmlModel);
+    for (T sbmlElement : getSbmlElementList()) {
+      Element element = parse(sbmlElement);
       if (element != null) {
         result.add(element);
         elementBySbmlId.put(element.getElementId(), element);
@@ -41,7 +43,7 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends
     return result;
   }
 
-  protected abstract ListOf<T> getSbmlElementList(Model sbmlModel);
+  protected abstract ListOf<T> getSbmlElementList();
 
   Map<String, Element> elementBySbmlId = new HashMap<>();
 
@@ -55,7 +57,7 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends
     return sbmlIdByElementId.get(compartmentId);
   }
 
-  protected List<Element> mergeLayout(List<? extends Element> elements, Layout sbmlLayout, Model sbmlModel)
+  protected List<Element> mergeLayout(List<? extends Element> elements)
       throws InvalidInputDataExecption {
     Set<String> used = new HashSet<>();
     List<Element> result = new ArrayList<>();
@@ -70,7 +72,7 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends
         applyStyleToElement(element, style);
       }
     }
-    for (Pair<String, AbstractReferenceGlyph> idGlyphPair : getGlyphs(sbmlLayout)) {
+    for (Pair<String, AbstractReferenceGlyph> idGlyphPair : getGlyphs()) {
       String id = idGlyphPair.getLeft();
       Element source = elementBySbmlId.get(id);
       if (source == null) {
@@ -82,7 +84,7 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends
         throw new InvalidInputDataExecption("Glyph for Species " + idGlyphPair.getLeft() + " doesn't have id");
       }
       Element elementWithLayout = createElementWithLayout(source, glyph);
-      minervaModel.addElement(elementWithLayout);
+      getMinervaModel().addElement(elementWithLayout);
       result.add(elementWithLayout);
       elementBySbmlId.put(id, elementWithLayout);
       elementBySbmlId.put(elementWithLayout.getElementId(), elementWithLayout);
@@ -93,7 +95,7 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends
         logger.warn("Layout doesn't contain information about Element: " + element.getElementId());
         result.add(element);
       } else {
-        minervaModel.removeElement(element);
+        getMinervaModel().removeElement(element);
       }
     }
     return result;
@@ -120,14 +122,17 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends
   }
 
   protected void applyStyleToElement(Element elementWithLayout, LocalStyle style) {
-    if (style.getGroup().getFill() != null) {
+    if (style.getGroup().isSetFill()) {
       Color backgroundColor = getColorByColorDefinition(style.getGroup().getFill());
       elementWithLayout.setColor(backgroundColor);
     }
+    if (style.getGroup().isSetFontSize()) {
+      elementWithLayout.setFontSize(style.getGroup().getFontSize());
+    }
   }
 
-  protected abstract List<Pair<String, AbstractReferenceGlyph>> getGlyphs(Layout sbmlLayout);
+  protected abstract List<Pair<String, AbstractReferenceGlyph>> getGlyphs();
 
-  protected abstract Element parse(T species, Model sbmlModel) throws InvalidInputDataExecption;
+  protected abstract Element parse(T species) throws InvalidInputDataExecption;
 
 }
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java
index 25fa73c370852f74c3251b892851a98950cb2359..90c34bcd67f40a232deedeadb5a4653e90499b76 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java
@@ -1,6 +1,10 @@
 package lcsb.mapviewer.converter.model.sbml;
 
 import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.xml.stream.XMLStreamException;
 
@@ -8,11 +12,11 @@ import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.log4j.Logger;
 import org.sbml.jsbml.Model;
 import org.sbml.jsbml.SBMLDocument;
-import org.sbml.jsbml.SBMLException;
 import org.sbml.jsbml.SBMLWriter;
 import org.sbml.jsbml.ext.layout.Dimensions;
 import org.sbml.jsbml.ext.layout.Layout;
 import org.sbml.jsbml.ext.layout.LayoutModelPlugin;
+import org.sbml.jsbml.ext.multi.MultiModelPlugin;
 import org.sbml.jsbml.ext.render.GlobalRenderInformation;
 import org.sbml.jsbml.ext.render.RenderLayoutPlugin;
 
@@ -26,40 +30,96 @@ import lcsb.mapviewer.model.map.InconsistentModelException;
 import lcsb.mapviewer.model.map.species.Species;
 
 public class SbmlExporter {
-  Logger logger = Logger.getLogger(SbmlExporter.class);
 
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(SbmlExporter.class);
+
+  /**
+   * Set of SBML extensions that should be used during export.
+   */
+  private Set<SbmlExtension> usedExtensions = new HashSet<>(Arrays.asList(SbmlExtension.values()));
+
+  /**
+   * Export input model into SBML xml.
+   * 
+   * @param model
+   *          input model
+   * @return SBML xml string
+   * @throws InconsistentModelException
+   *           thrown when there is problem with input model
+   */
   public String toXml(lcsb.mapviewer.model.map.model.Model model)
-      throws SBMLException, XMLStreamException, InconsistentModelException {
+      throws InconsistentModelException {
     try {
-      SBMLDocument doc = new SBMLDocument(3, 2);
-      Model result = doc.createModel(model.getIdModel());
-      result.setName(model.getName());
-      Layout layout = createSbmlLayout(model, result);
-
-      SbmlCompartmentExporter compartmentExporter = new SbmlCompartmentExporter(layout, model);
-      SbmlBioEntityExporter<Species, org.sbml.jsbml.Species> speciesExporter = new SbmlSpeciesExporter(layout, model,
-          compartmentExporter);
-      SbmlReactionExporter reactionExporter = new SbmlReactionExporter(layout, model, speciesExporter,
-          compartmentExporter);
-      SbmlUnitExporter unitExporter = new SbmlUnitExporter(model);
-      SbmlParameterExporter parameterExporter = new SbmlParameterExporter(model);
-      SbmlFunctionExporter functionExporter = new SbmlFunctionExporter(model);
-
-      compartmentExporter.exportElements(result);
-      speciesExporter.exportElements(result);
-      reactionExporter.exportElements(result);
-      unitExporter.exportUnits(result);
-      parameterExporter.exportParameter(result);
-      functionExporter.exportFunction(result);
+      SBMLDocument doc = toSbmlDocument(model);
 
       ByteArrayOutputStream stream = new ByteArrayOutputStream();
       SBMLWriter.write(doc, stream, "minerva", Configuration.getSystemVersion(null));
-      return stream.toString("UTF-8");
-    } catch (UnsupportedEncodingException e) {
+      return stream.toString("UTF-8")
+          // TODO bug: https://github.com/sbmlteam/jsbml/issues/158
+          .replace("<listOfSpeciesFeatures>", "<multi:listOfSpeciesFeatures>")
+          .replace("</listOfSpeciesFeatures>", "</multi:listOfSpeciesFeatures>");
+    } catch (UnsupportedEncodingException | XMLStreamException e) {
+      throw new InvalidStateException(e);
+    }
+  }
+
+  /**
+   * Translates input model into SBML model. {@link #usedExtensions} define which
+   * SBML extensions should be enabled in the SBML model.
+   * 
+   * @param model
+   *          input model
+   * @return SBML model
+   * @throws InconsistentModelException
+   *           thrown when there is problem with input model
+   */
+  protected SBMLDocument toSbmlDocument(lcsb.mapviewer.model.map.model.Model model) throws InconsistentModelException {
+    SBMLDocument doc = new SBMLDocument(3, 2);
+    Model result = doc.createModel(model.getIdModel());
+    result.setName(model.getName());
+    try {
+      result.setNotes(NotesUtility.prepareEscapedXmlNotes(model.getNotes()));
+    } catch (XMLStreamException e) {
       throw new InvalidStateException(e);
     }
+
+    if (usedExtensions.contains(SbmlExtension.LAYOUT)) {
+      createSbmlLayout(model, result);
+    }
+
+    if (usedExtensions.contains(SbmlExtension.MULTI)) {
+      createSbmlMultiPlugin(result);
+    }
+
+    SbmlCompartmentExporter compartmentExporter = new SbmlCompartmentExporter(result, model, usedExtensions);
+    SbmlBioEntityExporter<Species, org.sbml.jsbml.Species> speciesExporter = new SbmlSpeciesExporter(result, model,
+        usedExtensions,
+        compartmentExporter);
+    SbmlReactionExporter reactionExporter = new SbmlReactionExporter(result, model, speciesExporter,
+        usedExtensions, compartmentExporter);
+    SbmlUnitExporter unitExporter = new SbmlUnitExporter(model);
+    SbmlParameterExporter parameterExporter = new SbmlParameterExporter(model);
+    SbmlFunctionExporter functionExporter = new SbmlFunctionExporter(model);
+
+    compartmentExporter.exportElements();
+    speciesExporter.exportElements();
+    reactionExporter.exportElements();
+    unitExporter.exportUnits(result);
+    parameterExporter.exportParameter(result);
+    functionExporter.exportFunction(result);
+    return doc;
   }
 
+  /**
+   * Create SBML layout for the given model.
+   * 
+   * @param model
+   *          input model
+   * @param result
+   *          SBML model where layout should be embedded
+   * @return SBML layout
+   */
   public Layout createSbmlLayout(lcsb.mapviewer.model.map.model.Model model, Model result) {
     LayoutModelPlugin layoutPlugin = new LayoutModelPlugin(result);
     Layout layout = new Layout();
@@ -79,14 +139,66 @@ public class SbmlExporter {
     layoutPlugin.add(layout);
     result.addExtension("layout", layoutPlugin);
 
-    createSbmlRenderPlugin(layout, result);
+    if (usedExtensions.contains(SbmlExtension.RENDER)) {
+      createSbmlRenderPlugin(layout);
+    }
     return layout;
   }
 
-  RenderLayoutPlugin createSbmlRenderPlugin(Layout layout, Model result) {
+  protected MultiModelPlugin createSbmlMultiPlugin(Model result) {
+    MultiModelPlugin multiPlugin = new MultiModelPlugin(result);
+    result.addExtension("multi", multiPlugin);
+    return multiPlugin;
+  }
+
+  /**
+   * Creates SBML render plugin for SBML model.
+   * 
+   * @param layout
+   *          SBML layout where render package will be used
+   * @return render plugin
+   */
+  private RenderLayoutPlugin createSbmlRenderPlugin(Layout layout) {
     RenderLayoutPlugin renderPlugin = new RenderLayoutPlugin(layout);
     renderPlugin.setRenderInformation(new GlobalRenderInformation());
     layout.addExtension("render", renderPlugin);
     return renderPlugin;
   }
+
+  /**
+   * Removes set of extensions from export.
+   * 
+   * @param sbmlExtensions
+   *          set of extensions that shouldn't be used during export
+   */
+  public void removeSbmlExtensions(Collection<SbmlExtension> sbmlExtensions) {
+    usedExtensions.removeAll(sbmlExtensions);
+  }
+
+  /**
+   * Adds {@link SbmlExtension} to export
+   * 
+   * @param sbmlExtension
+   *          extension that should be used during export
+   */
+  public void addSbmlExtension(SbmlExtension sbmlExtension) {
+    usedExtensions.add(sbmlExtension);
+  }
+
+  /**
+   * @return set of extensions that will be used during export
+   */
+  public Set<SbmlExtension> getSbmlExtensions() {
+    return usedExtensions;
+  }
+
+  /**
+   * Removes extension from export
+   * 
+   * @param sbmlExtension
+   *          {@link SbmlExtension} that shouldn't be used during export
+   */
+  public void removeSbmlExtension(SbmlExtension sbmlExtension) {
+    usedExtensions.remove(sbmlExtension);
+  }
 }
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExtension.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..2b0ab4f8ac2e617b3a92f8a945b6cdb88781d9c6
--- /dev/null
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExtension.java
@@ -0,0 +1,7 @@
+package lcsb.mapviewer.converter.model.sbml;
+
+public enum SbmlExtension {
+  LAYOUT,
+  RENDER,
+  MULTI;
+}
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlFunctionParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlFunctionParser.java
index cb2550ba4c62cdc9937fcfcb92179f7276c6fbad..c27fb104955f21e8a7adb31bac586a1c2dfb20fe 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlFunctionParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlFunctionParser.java
@@ -16,8 +16,8 @@ import lcsb.mapviewer.model.map.kinetics.SbmlFunction;
 public class SbmlFunctionParser extends SbmlBioEntityParser {
   Logger logger = Logger.getLogger(SbmlFunctionParser.class);
 
-  public SbmlFunctionParser(lcsb.mapviewer.model.map.model.Model minervaModel) {
-    this.minervaModel = minervaModel;
+  public SbmlFunctionParser(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel) {
+    super(sbmlModel, minervaModel);
   }
 
   protected SbmlFunction parse(org.sbml.jsbml.FunctionDefinition unitDefinition, Model sbmlModel) throws InvalidInputDataExecption {
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterParser.java
index f2a9f645e0ee9050a393d8a870be3726523c5ffe..9669f5992b25517b795685a2174f2a7d08d3e99e 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterParser.java
@@ -14,15 +14,15 @@ import lcsb.mapviewer.model.map.kinetics.SbmlParameter;
 public class SbmlParameterParser extends SbmlBioEntityParser {
   Logger logger = Logger.getLogger(SbmlParameterParser.class);
 
-  public SbmlParameterParser(lcsb.mapviewer.model.map.model.Model minervaModel) {
-    this.minervaModel = minervaModel;
+  public SbmlParameterParser(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel) {
+    super(sbmlModel, minervaModel);
   }
 
   protected SbmlParameter parse(org.sbml.jsbml.QuantityWithUnit unitDefinition) {
     SbmlParameter result = new SbmlParameter(unitDefinition.getId());
     result.setName(unitDefinition.getName());
     result.setValue(unitDefinition.getValue());
-    result.setUnits(minervaModel.getUnitsByUnitId(unitDefinition.getUnits()));
+    result.setUnits(getMinervaModel().getUnitsByUnitId(unitDefinition.getUnits()));
     return result;
   }
 
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java
index c571d56b732ea5f115ae7133435efcd8f526986b..7bf2917282320d5441c260079b6034a967130c56 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java
@@ -14,11 +14,11 @@ import javax.xml.stream.XMLStreamException;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.log4j.Logger;
 import org.sbml.jsbml.SBMLDocument;
-import org.sbml.jsbml.SBMLException;
 import org.sbml.jsbml.SBMLReader;
 import org.sbml.jsbml.ext.SBasePlugin;
 import org.sbml.jsbml.ext.layout.Layout;
 import org.sbml.jsbml.ext.layout.LayoutModelPlugin;
+import org.sbml.jsbml.ext.multi.MultiModelPlugin;
 import org.sbml.jsbml.ext.render.LocalStyle;
 
 import lcsb.mapviewer.commands.CommandExecutionException;
@@ -46,6 +46,8 @@ import lcsb.mapviewer.model.map.reaction.type.BooleanLogicGateReaction;
 import lcsb.mapviewer.model.map.species.Complex;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationResidue;
 
 public class SbmlParser implements IConverter {
 
@@ -66,16 +68,18 @@ public class SbmlParser implements IConverter {
       org.sbml.jsbml.Model sbmlModel = sbmlDocument.getModel();
       model.setIdModel(sbmlModel.getId());
       model.setName(sbmlModel.getName());
+      model.setNotes(NotesUtility.extractNotes(sbmlModel));
 
+      checkAvailableExtensions(sbmlModel);
       Layout layout = getSbmlLayout(sbmlModel);
       boolean layoutExists = layout != null;
 
-      SbmlCompartmentParser compartmentParser = new SbmlCompartmentParser(layout, model);
-      SbmlSpeciesParser speciesParser = new SbmlSpeciesParser(layout, model);
-      SbmlReactionParser reactionParser = new SbmlReactionParser(layout, model, speciesParser, compartmentParser);
-      SbmlUnitsParser unitParser = new SbmlUnitsParser(model);
-      SbmlParameterParser parameterParser = new SbmlParameterParser(model);
-      SbmlFunctionParser functionParser = new SbmlFunctionParser(model);
+      SbmlCompartmentParser compartmentParser = new SbmlCompartmentParser(sbmlModel, model);
+      SbmlSpeciesParser speciesParser = new SbmlSpeciesParser(sbmlModel, model);
+      SbmlReactionParser reactionParser = new SbmlReactionParser(sbmlModel, model, speciesParser, compartmentParser);
+      SbmlUnitsParser unitParser = new SbmlUnitsParser(sbmlModel, model);
+      SbmlParameterParser parameterParser = new SbmlParameterParser(sbmlModel, model);
+      SbmlFunctionParser functionParser = new SbmlFunctionParser(sbmlModel, model);
 
       Set<MiriamData> annotations = compartmentParser.parseAnnotation(sbmlModel.getAnnotation());
       if (annotations.size() > 0) {
@@ -86,9 +90,9 @@ public class SbmlParser implements IConverter {
       model.addParameters(parameterParser.parseList(sbmlModel));
       model.addFunctions(functionParser.parseList(sbmlModel));
 
-      model.addElements(compartmentParser.parseList(sbmlModel));
-      model.addElements(speciesParser.parseList(sbmlModel));
-      model.addReactions(reactionParser.parseList(sbmlModel));
+      model.addElements(compartmentParser.parseList());
+      model.addElements(speciesParser.parseList());
+      model.addReactions(reactionParser.parseList());
 
       if (layoutExists) {
         if (layout.getDimensions() != null) {
@@ -96,9 +100,9 @@ public class SbmlParser implements IConverter {
           model.setHeight(layout.getDimensions().getHeight());
 
         }
-        compartmentParser.mergeLayout(model.getCompartments(), layout, sbmlModel);
-        speciesParser.mergeLayout(model.getSpeciesList(), layout, sbmlModel);
-        reactionParser.mergeLayout(model.getReactions(), layout, sbmlModel);
+        compartmentParser.mergeLayout(model.getCompartments());
+        speciesParser.mergeLayout(model.getSpeciesList());
+        reactionParser.mergeLayout(model.getReactions());
       }
 
       reactionParser.validateReactions(model.getReactions());
@@ -183,6 +187,12 @@ public class SbmlParser implements IConverter {
     for (Element element : model.getElements()) {
       if (element.getWidth() == 0 || element.getHeight() == 0) {
         bioEntitesRequiringLayout.add(element);
+      } else if (element instanceof SpeciesWithModificationResidue) {
+        for (ModificationResidue mr : ((SpeciesWithModificationResidue) element).getModificationResidues()) {
+          if (mr.getPosition() == null) {
+            bioEntitesRequiringLayout.add(element);
+          }
+        }
       }
     }
     for (Reaction reaction : model.getReactions()) {
@@ -254,14 +264,23 @@ public class SbmlParser implements IConverter {
           } else {
             layout = layoutPlugin.getLayout(0);
           }
-        } else {
-          logger.warn("Unknown sbml plugin: " + plugin);
         }
       }
     }
     return layout;
   }
 
+  private void checkAvailableExtensions(org.sbml.jsbml.Model sbmlModel) {
+    if (sbmlModel.getExtensionCount() > 0) {
+      for (SBasePlugin plugin : sbmlModel.getExtensionPackages().values()) {
+        if (!plugin.getClass().equals(LayoutModelPlugin.class) &&
+            !plugin.getClass().equals(MultiModelPlugin.class)) {
+          logger.warn("Unknown sbml plugin: " + plugin);
+        }
+      }
+    }
+  }
+
   @Override
   public InputStream exportModelToInputStream(Model model) throws ConverterException, InconsistentModelException {
     String exportedString = toXml(model);
@@ -272,7 +291,7 @@ public class SbmlParser implements IConverter {
   private String toXml(Model model) throws ConverterException {
     try {
       return new SbmlExporter().toXml(model);
-    } catch (SBMLException | XMLStreamException | InconsistentModelException e) {
+    } catch (InconsistentModelException e) {
       throw new ConverterException(e);
     }
   }
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentExporter.java
index d47b472dc0d2920154d1d807a1cd8aa43a5ec53f..8b2a8bf0d5f151211a7a77a10d22e626b63b3346 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentExporter.java
@@ -1,25 +1,31 @@
 package lcsb.mapviewer.converter.model.sbml.compartment;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.log4j.Logger;
+import org.sbml.jsbml.Model;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
 import org.sbml.jsbml.ext.layout.BoundingBox;
 import org.sbml.jsbml.ext.layout.CompartmentGlyph;
 import org.sbml.jsbml.ext.layout.Dimensions;
-import org.sbml.jsbml.ext.layout.Layout;
 import org.sbml.jsbml.ext.layout.Point;
 
 import lcsb.mapviewer.converter.model.sbml.SbmlElementExporter;
+import lcsb.mapviewer.converter.model.sbml.SbmlExtension;
 import lcsb.mapviewer.model.map.InconsistentModelException;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 
 public class SbmlCompartmentExporter extends SbmlElementExporter<Compartment, org.sbml.jsbml.Compartment> {
-  Logger logger = Logger.getLogger(SbmlCompartmentExporter.class);
+  /**
+   * Default class logger.
+   */
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(SbmlCompartmentExporter.class);
 
-  public SbmlCompartmentExporter(Layout layout, lcsb.mapviewer.model.map.model.Model minervaModel) {
-    super(layout, minervaModel);
+  public SbmlCompartmentExporter(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel, Collection<SbmlExtension> sbmlExtensions) {
+    super(sbmlModel, minervaModel, sbmlExtensions);
   }
 
   @Override
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentParser.java
index 7fe2925b571841f96f5baa348b556e42127f4000..879624e0bf01290a5aff7e1bec043b8aa5df247d 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentParser.java
@@ -8,7 +8,6 @@ import org.sbml.jsbml.ListOf;
 import org.sbml.jsbml.Model;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
 import org.sbml.jsbml.ext.layout.CompartmentGlyph;
-import org.sbml.jsbml.ext.layout.Layout;
 
 import lcsb.mapviewer.commands.layout.ApplySimpleLayoutModelCommand;
 import lcsb.mapviewer.common.Pair;
@@ -19,14 +18,18 @@ import lcsb.mapviewer.model.map.compartment.SquareCompartment;
 import lcsb.mapviewer.model.map.species.Element;
 
 public class SbmlCompartmentParser extends SbmlElementParser<org.sbml.jsbml.Compartment> {
-  Logger logger = Logger.getLogger(SbmlCompartmentParser.class);
+  /**
+   * Default class logger.
+   */
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(SbmlCompartmentParser.class);
 
-  public SbmlCompartmentParser(Layout layout, lcsb.mapviewer.model.map.model.Model minervaModel) {
-    super(layout, minervaModel);
+  public SbmlCompartmentParser(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel) {
+    super(sbmlModel, minervaModel);
   }
 
   @Override
-  protected Compartment parse(org.sbml.jsbml.Compartment compartment, Model sbmlModel)
+  protected Compartment parse(org.sbml.jsbml.Compartment compartment)
       throws InvalidInputDataExecption {
     if (compartment.getId().equals("default")) {
       return null;
@@ -37,18 +40,18 @@ public class SbmlCompartmentParser extends SbmlElementParser<org.sbml.jsbml.Comp
   }
 
   @Override
-  protected ListOf<org.sbml.jsbml.Compartment> getSbmlElementList(Model sbmlModel) {
-    return sbmlModel.getListOfCompartments();
+  protected ListOf<org.sbml.jsbml.Compartment> getSbmlElementList() {
+    return getSbmlModel().getListOfCompartments();
   }
 
   @Override
-  public List<Element> mergeLayout(List<? extends Element> elements, Layout sbmlLayout, Model sbmlModel)
+  public List<Element> mergeLayout(List<? extends Element> elements)
       throws InvalidInputDataExecption {
-    List<Element> result = super.mergeLayout(elements, sbmlLayout, sbmlModel);
+    List<Element> result = super.mergeLayout(elements);
 
     for (Element element : result) {
       Compartment parent = element.getCompartment();
-      for (Compartment compartment : minervaModel.getCompartments()) {
+      for (Compartment compartment : getMinervaModel().getCompartments()) {
         compartment.setNamePoint(compartment.getX() + ApplySimpleLayoutModelCommand.COMPARTMENT_BORDER,
             compartment.getY() + ApplySimpleLayoutModelCommand.COMPARTMENT_BORDER);
         if (parent == null || parent.getSize() > compartment.getSize()) {
@@ -65,9 +68,9 @@ public class SbmlCompartmentParser extends SbmlElementParser<org.sbml.jsbml.Comp
   }
 
   @Override
-  protected List<Pair<String, AbstractReferenceGlyph>> getGlyphs(Layout sbmlLayout) {
+  protected List<Pair<String, AbstractReferenceGlyph>> getGlyphs() {
     List<Pair<String, AbstractReferenceGlyph>> result = new ArrayList<>();
-    for (CompartmentGlyph glyph : sbmlLayout.getListOfCompartmentGlyphs()) {
+    for (CompartmentGlyph glyph : getLayout().getListOfCompartmentGlyphs()) {
       if (!glyph.getCompartment().equals("default")) {
         result.add(new Pair<>(glyph.getCompartment(), glyph));
       }
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/BioEntityFeature.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/BioEntityFeature.java
new file mode 100644
index 0000000000000000000000000000000000000000..63d464554fee296a949360a363f784189f299fa0
--- /dev/null
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/BioEntityFeature.java
@@ -0,0 +1,71 @@
+package lcsb.mapviewer.converter.model.sbml.extension.multi;
+
+import lcsb.mapviewer.model.map.species.Complex;
+import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.Protein;
+
+public enum BioEntityFeature {
+  STRUCTURAL_STATE("Structural state", "", new Class<?>[] { Protein.class, Complex.class },
+      "minerva_structural_state_"),
+
+  POSITION_TO_COMPARTMENT("Position to compartment", MultiPackageNamingUtils.NULL_REPRESENTATION, new Class<?>[] { Element.class },
+      "minerva_position_to_compartment_"),
+
+  SYNONYM("Synonym", null, new Class<?>[] { Element.class },
+      "minerva_synonym_"),
+
+  FORMER_SYMBOL("Former symbol", null, new Class<?>[] { Element.class },
+      "minerva_former_symbol_"),
+
+  FULL_NAME("Full name", null, new Class<?>[] { Element.class },
+      "minerva_full_name_"),
+
+  FORMULA("Formula", null, new Class<?>[] { Element.class },
+      "minerva_formula_"),
+
+  HYPOTHETICAL("Hypothetical", null, new Class<?>[] { Element.class },
+      "minerva_hypothetical_"),
+
+  ACTIVITY("Activity", null, new Class<?>[] { Element.class },
+      "minerva_activity_"),
+
+  DIMER("Dimer", null, new Class<?>[] { Element.class },
+      "minerva_dimer_"),
+
+  CHARGE("Charge", null, new Class<?>[] { Element.class },
+      "minerva_charge_"),
+
+  ABBREVIATION("Abbreviation", null, new Class<?>[] { Element.class },
+      "minerva_abbreviation_"),
+
+  SYMBOL("Symbol", null, new Class<?>[] { Element.class },
+      "minerva_symbol_");
+
+  private String featureName;
+  private String defaultValue;
+  private Class<?>[] properClasses;
+  private String idPrefix;
+
+  private BioEntityFeature(String featureName, String defaultValue, Class<?>[] properClasses, String idPrefix) {
+    this.featureName = featureName;
+    this.defaultValue = defaultValue;
+    this.properClasses = properClasses;
+    this.idPrefix = idPrefix;
+  }
+
+  public String getFeatureName() {
+    return featureName;
+  }
+
+  public String getDefaultValue() {
+    return defaultValue;
+  }
+
+  public Class<?>[] getProperClasses() {
+    return properClasses;
+  }
+
+  public String getIdPrefix() {
+    return idPrefix;
+  }
+}
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/MultiPackageNamingUtils.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/MultiPackageNamingUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ef585cd49603525b741891f7130b9324ee41ae0
--- /dev/null
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/extension/multi/MultiPackageNamingUtils.java
@@ -0,0 +1,124 @@
+package lcsb.mapviewer.converter.model.sbml.extension.multi;
+
+import org.apache.log4j.Logger;
+import org.sbml.jsbml.ext.multi.MultiSpeciesType;
+
+import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.AbstractSiteModification;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationState;
+import lcsb.mapviewer.model.map.species.field.TranscriptionSite;
+
+/**
+ * Class responsible for providing identifiers of structures inside multi
+ * package.
+ * 
+ * @author Piotr Gawron
+ *
+ */
+public final class MultiPackageNamingUtils {
+  
+  /**
+   * Default logger.
+   */
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(MultiPackageNamingUtils.class);
+
+  private static final String MINERVA_MODIFICATION_TYPE_PREFIX = "minerva_modification_type_";
+
+  public static final String NULL_REPRESENTATION = "NULL";
+
+  /**
+   * Returns id of the {@link MultiSpeciesType} for a given minerva class.
+   * 
+   * @param speciesClass
+   *          minerva {@link Element} class.
+   * @return id of the {@link MultiSpeciesType} for a given minerva class
+   */
+  public static final String getSpeciesTypeId(Class<?> speciesClass) {
+    return "minerva_species_type_" + speciesClass.getSimpleName();
+  }
+
+  /**
+   * Returns id of the {@link MultiSpeciesType} for a given minerva element
+   * object.
+   * 
+   * @param speciesClass
+   *          object for which we want to get id
+   * 
+   * @return id of the {@link MultiSpeciesType} for a given minerva object
+   */
+  public static final String getSpeciesTypeId(Element element) {
+    return getSpeciesTypeId(element.getClass());
+  }
+
+  public static final String getFeatureId(Class<?> speciesClass, BioEntityFeature feature) {
+    return feature.getIdPrefix() + speciesClass.getSimpleName();
+  }
+
+  public static String getFeatureId(Species element, BioEntityFeature feature) {
+    return getFeatureId(element.getClass(), feature);
+  }
+
+  public static boolean isFeatureId(String featureTypeId, BioEntityFeature feature) {
+    return featureTypeId.startsWith(feature.getIdPrefix());
+  }
+
+  public static String getModificationFeatureId(ModificationResidue mr) {
+    String stateSuffix = "";
+    if (mr instanceof AbstractSiteModification) {
+      if (((AbstractSiteModification) mr).getState() != null) {
+        stateSuffix = "_" + ((AbstractSiteModification) mr).getState().name();
+      } else {
+        stateSuffix = "_null";
+      }
+    } else if (mr instanceof TranscriptionSite) {
+      stateSuffix = "_" + ((TranscriptionSite) mr).getActive() + "_" + ((TranscriptionSite) mr).getDirection();
+    }
+
+    return MINERVA_MODIFICATION_TYPE_PREFIX + mr.getSpecies().getClass().getSimpleName() + "_"
+        + mr.getClass().getSimpleName() + stateSuffix;
+  }
+
+  public static boolean isModificationFeatureId(String featureTypeString) {
+    return featureTypeString.startsWith(MINERVA_MODIFICATION_TYPE_PREFIX);
+  }
+
+  public static boolean isModificationFeatureId(String speciesFeatureType,
+      Class<? extends ModificationResidue> class1) {
+    return isModificationFeatureId(speciesFeatureType) && speciesFeatureType.contains("_" + class1.getSimpleName());
+  }
+
+  public static ModificationState getModificationStateFromFeatureTypeName(String featureTypeString) {
+    for (ModificationState state : ModificationState.values()) {
+      if (featureTypeString.endsWith(state.name())) {
+        return state;
+      }
+    }
+    return null;
+  }
+
+  public static Boolean getTranscriptionFactorActiveStateFromFeatureTypeName(String featureTypeString) {
+    String tmp[] = featureTypeString.split("_");
+    Boolean result = null;
+    if (tmp.length >= 2) {
+      if (tmp[tmp.length - 2].equalsIgnoreCase("TRUE")) {
+        result = true;
+      } else if (tmp[tmp.length - 2].equalsIgnoreCase("FALSE")) {
+        result = false;
+      }
+    }
+    return result;
+  }
+
+  public static String getTranscriptionFactorDirectionStateFromFeatureTypeName(String featureTypeString) {
+    String tmp[] = featureTypeString.split("_");
+    String result = null;
+    if (tmp.length >= 1) {
+      result = tmp[tmp.length - 1];
+    }
+    return result;
+  }
+
+}
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java
index 441ee02e450c67864debaa1f489399fd54f78157..1c0323f3267b8ea24b9ec972c8b982de815f2982 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java
@@ -17,7 +17,6 @@ import org.sbml.jsbml.Species;
 import org.sbml.jsbml.SpeciesReference;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
 import org.sbml.jsbml.ext.layout.Curve;
-import org.sbml.jsbml.ext.layout.Layout;
 import org.sbml.jsbml.ext.layout.LineSegment;
 import org.sbml.jsbml.ext.layout.Point;
 import org.sbml.jsbml.ext.layout.ReactionGlyph;
@@ -32,6 +31,7 @@ import org.w3c.dom.Node;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
 import lcsb.mapviewer.converter.model.sbml.SbmlBioEntityExporter;
+import lcsb.mapviewer.converter.model.sbml.SbmlExtension;
 import lcsb.mapviewer.model.map.InconsistentModelException;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.kinetics.SbmlKinetics;
@@ -47,20 +47,27 @@ import lcsb.mapviewer.model.map.reaction.ReactionNode;
 import lcsb.mapviewer.model.map.species.Element;
 
 public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sbml.jsbml.Reaction> {
-  Logger logger = Logger.getLogger(SbmlReactionExporter.class);
+  /**
+   * Default class logger.
+   */
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(SbmlReactionExporter.class);
+
   private SbmlBioEntityExporter<lcsb.mapviewer.model.map.species.Species, Species> speciesExporter;
+
   private SbmlBioEntityExporter<Compartment, org.sbml.jsbml.Compartment> compartmentExporter;
 
-  public SbmlReactionExporter(Layout layout, lcsb.mapviewer.model.map.model.Model minervaModel,
+  private Map<ReactionNode, SimpleSpeciesReference> speciesReferenceByReactionNode = new HashMap<>();
+
+  public SbmlReactionExporter(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel,
       SbmlBioEntityExporter<lcsb.mapviewer.model.map.species.Species, Species> speciesExporter,
+      Collection<SbmlExtension> sbmlExtensions,
       SbmlBioEntityExporter<lcsb.mapviewer.model.map.compartment.Compartment, org.sbml.jsbml.Compartment> compartmentExporter) {
-    super(layout, minervaModel);
+    super(sbmlModel, minervaModel, sbmlExtensions);
     this.speciesExporter = speciesExporter;
     this.compartmentExporter = compartmentExporter;
   }
 
-  Map<ReactionNode, SimpleSpeciesReference> speciesReferenceByReactionNode = new HashMap<>();
-
   @Override
   public org.sbml.jsbml.Reaction createSbmlElement(Reaction reaction) throws InconsistentModelException {
     String reactionId = getReactionId(reaction);
@@ -251,14 +258,16 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb
       assignStyleToGlyph(modifierGlyph, style);
     }
 
-    LocalStyle style = createStyle(reaction);
-    ColorDefinition color = getColorDefinition(reaction.getReactants().get(0).getLine().getColor());
-    style.getGroup().setStrokeWidth(reaction.getReactants().get(0).getLine().getWidth());
-    style.getGroup().setFill(color.getId());
-    style.getGroup().setStroke(reaction.getReactants().get(0).getLine().getType().name());
-    style.getGroup().setEndHead(reaction.getProducts().get(0).getLine().getEndAtd().getArrowType().name());
+    if (isExtensionEnabled(SbmlExtension.RENDER)) {
+      LocalStyle style = createStyle(reaction);
+      ColorDefinition color = getColorDefinition(reaction.getReactants().get(0).getLine().getColor());
+      style.getGroup().setStrokeWidth(reaction.getReactants().get(0).getLine().getWidth());
+      style.getGroup().setFill(color.getId());
+      style.getGroup().setStroke(reaction.getReactants().get(0).getLine().getType().name());
+      style.getGroup().setEndHead(reaction.getProducts().get(0).getLine().getEndAtd().getArrowType().name());
 
-    assignStyleToGlyph(reactionGlyph, style);
+      assignStyleToGlyph(reactionGlyph, style);
+    }
 
   }
 
@@ -315,11 +324,6 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb
     return curve;
   }
 
-  @Override
-  protected void setSbmlModel(Model sbmlModel) {
-    super.setSbmlModel(sbmlModel);
-  }
-
   @Override
   protected String getSbmlIdKey(Reaction element) {
     return element.getClass().getSimpleName() + "\n" + element.getElementId();
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
index 2675a9451b07b81bbef9fd28c8cf2e95bd864500..b2f050185bb3ce0d996db24f727086cfb43f96dc 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
@@ -19,7 +19,6 @@ import org.sbml.jsbml.Model;
 import org.sbml.jsbml.ModifierSpeciesReference;
 import org.sbml.jsbml.SpeciesReference;
 import org.sbml.jsbml.ext.layout.CurveSegment;
-import org.sbml.jsbml.ext.layout.Layout;
 import org.sbml.jsbml.ext.layout.ReactionGlyph;
 import org.sbml.jsbml.ext.layout.SpeciesGlyph;
 import org.sbml.jsbml.ext.layout.SpeciesReferenceGlyph;
@@ -70,33 +69,31 @@ import lcsb.mapviewer.modelutils.map.ElementUtils;
 public class SbmlReactionParser extends SbmlBioEntityParser {
   Logger logger = Logger.getLogger(SbmlReactionParser.class);
 
-  lcsb.mapviewer.model.map.model.Model minervaModel;
   ElementUtils eu = new ElementUtils();
 
   SbmlSpeciesParser speciesParser;
   SbmlCompartmentParser compartmentParser;
 
-  public SbmlReactionParser(Layout sbmlLayout, lcsb.mapviewer.model.map.model.Model minervaModel,
+  public SbmlReactionParser(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel,
       SbmlSpeciesParser speciesParser, SbmlCompartmentParser compartmentParser) {
-    this.layout = sbmlLayout;
-    this.minervaModel = minervaModel;
+    super(sbmlModel, minervaModel);
     this.speciesParser = speciesParser;
     this.compartmentParser = compartmentParser;
   }
 
-  public List<Reaction> parseList(Model sbmlModel) throws InvalidInputDataExecption {
+  public List<Reaction> parseList() throws InvalidInputDataExecption {
     List<Reaction> result = new ArrayList<>();
-    for (org.sbml.jsbml.Reaction sbmlElement : getSbmlElementList(sbmlModel)) {
-      result.add(parse(sbmlElement, sbmlModel));
+    for (org.sbml.jsbml.Reaction sbmlElement : getSbmlElementList()) {
+      result.add(parse(sbmlElement));
     }
     return result;
   }
 
-  protected ListOf<org.sbml.jsbml.Reaction> getSbmlElementList(Model sbmlModel) {
-    return sbmlModel.getListOfReactions();
+  protected ListOf<org.sbml.jsbml.Reaction> getSbmlElementList() {
+    return getSbmlModel().getListOfReactions();
   }
 
-  public void mergeLayout(Collection<Reaction> reactions, Layout sbmlLayout, Model sbmlModel)
+  public void mergeLayout(Collection<Reaction> reactions)
       throws InvalidInputDataExecption {
     Set<Reaction> used = new HashSet<>();
     Map<String, Reaction> reactionById = new HashMap<>();
@@ -107,7 +104,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
       reactionById.put(reaction.getIdReaction(), reaction);
     }
 
-    for (ReactionGlyph glyph : sbmlLayout.getListOfReactionGlyphs()) {
+    for (ReactionGlyph glyph : getLayout().getListOfReactionGlyphs()) {
       Reaction source = reactionById.get(glyph.getReaction());
       if (source == null) {
         throw new InvalidInputDataExecption("Layout contains invalid Species id: " + glyph.getReaction());
@@ -119,7 +116,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
         // getId doesn't have to be unique, therefore we concatenate with reaction
         reactionWithLayout.setIdReaction(glyph.getReaction() + "__" + glyph.getId());
         for (SpeciesReferenceGlyph speciesRefernceGlyph : glyph.getListOfSpeciesReferenceGlyphs()) {
-          SpeciesGlyph speciesGlyph = layout.getSpeciesGlyph(speciesRefernceGlyph.getSpeciesGlyph());
+          SpeciesGlyph speciesGlyph = getLayout().getSpeciesGlyph(speciesRefernceGlyph.getSpeciesGlyph());
           ReactionNode minervaNode = null;
           Class<? extends ReactionNode> nodeClass = getReactionNodeClass(speciesRefernceGlyph);
 
@@ -144,7 +141,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
                 "Cannot find reaction node for layouted reaction: " + speciesGlyph.getSpecies() + ", " + glyph.getId());
           }
           glyphByNode.put(minervaNode, speciesRefernceGlyph);
-          Element minervaElement = minervaModel.getElementByElementId(speciesGlyph.getId());
+          Element minervaElement = getMinervaModel().getElementByElementId(speciesGlyph.getId());
           if (minervaElement == null) {
             throw new InvalidInputDataExecption("Cannot find layouted reaction node for layouted reaction: "
                 + speciesGlyph.getId() + ", " + glyph.getId());
@@ -211,7 +208,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
           }
         }
 
-        minervaModel.addReaction(reactionWithLayout);
+        getMinervaModel().addReaction(reactionWithLayout);
       } catch (InvalidArgumentException e) {
         throw new InvalidInputDataExecption(e);
       }
@@ -229,7 +226,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
       }
     }
     for (Reaction reaction : elementsToRemove) {
-      minervaModel.removeReaction(reaction);
+      getMinervaModel().removeReaction(reaction);
     }
   }
 
@@ -419,13 +416,13 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
       }
       if (elementToRemove != null) {
         kinetics.removeElement(elementToRemove);
-        kinetics.addElement(minervaModel.getElementByElementId(newElementId));
+        kinetics.addElement(getMinervaModel().getElementByElementId(newElementId));
       }
     }
 
   }
 
-  protected Reaction parse(org.sbml.jsbml.Reaction sbmlReaction, Model sbmlModel) throws InvalidInputDataExecption {
+  protected Reaction parse(org.sbml.jsbml.Reaction sbmlReaction) throws InvalidInputDataExecption {
     Reaction reaction = new Reaction();
     assignBioEntityData(sbmlReaction, reaction);
     reaction.setIdReaction(sbmlReaction.getId());
@@ -438,7 +435,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
       }
     }
     for (SpeciesReference reactant : sbmlReaction.getListOfReactants()) {
-      Species element = minervaModel.getElementByElementId(reactant.getSpecies());
+      Species element = getMinervaModel().getElementByElementId(reactant.getSpecies());
       if (element == null) {
         throw new InvalidInputDataExecption(
             eu.getElementTag(reaction) + "Species with id " + reactant.getSpecies() + " cannot be found");
@@ -446,7 +443,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
       reaction.addReactant(new Reactant(element));
     }
     for (SpeciesReference product : sbmlReaction.getListOfProducts()) {
-      Species element = minervaModel.getElementByElementId(product.getSpecies());
+      Species element = getMinervaModel().getElementByElementId(product.getSpecies());
       if (element == null) {
         throw new InvalidInputDataExecption(
             eu.getElementTag(reaction) + "Species with id " + product.getSpecies() + " cannot be found");
@@ -455,7 +452,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
     }
 
     for (ModifierSpeciesReference modifier : sbmlReaction.getListOfModifiers()) {
-      Species element = minervaModel.getElementByElementId(modifier.getSpecies());
+      Species element = getMinervaModel().getElementByElementId(modifier.getSpecies());
       Class<? extends Modifier> nodeClass = SBOTermModifierType.getTypeSBOTerm(modifier.getSBOTermID());
       try {
         Modifier newNode = nodeClass.getConstructor(Element.class).newInstance(element);
@@ -513,23 +510,33 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
     SbmlKinetics result = new SbmlKinetics();
     result.setDefinition(kineticLaw.getMath().toMathML());
 
-    SbmlParameterParser parameterParser = new SbmlParameterParser(minervaModel);
+    SbmlParameterParser parameterParser = new SbmlParameterParser(getSbmlModel(), getMinervaModel());
     result.addParameters(parameterParser.parseList((Collection<LocalParameter>) kineticLaw.getListOfLocalParameters()));
 
     try {
       Node node = super.getXmlDocumentFromString(result.getDefinition());
       Set<SbmlArgument> elementsUsedInKinetics = new HashSet<>();
       for (Node ciNode : super.getAllNotNecessirellyDirectChild("ci", node)) {
+        List<String> attributesToRemove = new ArrayList<>();
+        for (int y = 0; y < ciNode.getAttributes().getLength(); y++) {
+          Node attr = ciNode.getAttributes().item(y);
+          attributesToRemove.add(attr.getNodeName());
+        }
+        for (String attributeName : attributesToRemove) {
+          ciNode.getAttributes().removeNamedItem(attributeName);
+          logger.warn("Kinetics attribute not supported: " + attributeName);
+        }
+
         String id = super.getNodeValue(ciNode).trim();
-        SbmlArgument element = minervaModel.getElementByElementId(id);
+        SbmlArgument element = getMinervaModel().getElementByElementId(id);
         if (element == null) {
           element = result.getParameterById(id);
         }
         if (element == null) {
-          element = minervaModel.getParameterById(id);
+          element = getMinervaModel().getParameterById(id);
         }
         if (element == null) {
-          element = minervaModel.getFunctionById(id);
+          element = getMinervaModel().getFunctionById(id);
         }
         if (element != null) {
           ciNode.setTextContent(element.getElementId());
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java
index 806ba53900fdce13be552be6f00f72c7a04b770c..5eeb0009a8db4fe800d06f8a23b223ab42c5e600 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java
@@ -1,24 +1,72 @@
 package lcsb.mapviewer.converter.model.sbml.species;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
+import org.sbml.jsbml.Model;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
-import org.sbml.jsbml.ext.layout.Layout;
+import org.sbml.jsbml.ext.layout.BoundingBox;
+import org.sbml.jsbml.ext.layout.Dimensions;
+import org.sbml.jsbml.ext.layout.GeneralGlyph;
+import org.sbml.jsbml.ext.layout.Point;
+import org.sbml.jsbml.ext.layout.ReferenceGlyph;
+import org.sbml.jsbml.ext.multi.MultiModelPlugin;
+import org.sbml.jsbml.ext.multi.MultiSpeciesPlugin;
+import org.sbml.jsbml.ext.multi.MultiSpeciesType;
+import org.sbml.jsbml.ext.multi.PossibleSpeciesFeatureValue;
+import org.sbml.jsbml.ext.multi.SpeciesFeature;
+import org.sbml.jsbml.ext.multi.SpeciesFeatureType;
+import org.sbml.jsbml.ext.multi.SpeciesFeatureValue;
 import org.sbml.jsbml.ext.render.LocalStyle;
 
 import lcsb.mapviewer.converter.model.sbml.SbmlElementExporter;
+import lcsb.mapviewer.converter.model.sbml.SbmlExtension;
 import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentExporter;
+import lcsb.mapviewer.converter.model.sbml.extension.multi.BioEntityFeature;
+import lcsb.mapviewer.converter.model.sbml.extension.multi.MultiPackageNamingUtils;
 import lcsb.mapviewer.model.map.InconsistentModelException;
+import lcsb.mapviewer.model.map.MiriamData;
+import lcsb.mapviewer.model.map.species.AntisenseRna;
+import lcsb.mapviewer.model.map.species.Complex;
+import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.Gene;
+import lcsb.mapviewer.model.map.species.Protein;
+import lcsb.mapviewer.model.map.species.Rna;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.AbstractRegionModification;
+import lcsb.mapviewer.model.map.species.field.AbstractSiteModification;
+import lcsb.mapviewer.model.map.species.field.BindingRegion;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
+import lcsb.mapviewer.model.map.species.field.RegulatoryRegion;
+import lcsb.mapviewer.model.map.species.field.Residue;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationResidue;
+import lcsb.mapviewer.model.map.species.field.TranscriptionSite;
 
 public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.jsbml.Species> {
-  Logger logger = Logger.getLogger(SbmlSpeciesExporter.class);
+
+  private static int idCounter = 0;
+
+  /**
+   * Default class logger.
+   */
+  private static Logger logger = Logger.getLogger(SbmlSpeciesExporter.class);
+
   private SbmlCompartmentExporter compartmentExporter;
 
-  public SbmlSpeciesExporter(Layout layout, lcsb.mapviewer.model.map.model.Model minervaModel,
+  public SbmlSpeciesExporter(Model sbmlModel,
+      lcsb.mapviewer.model.map.model.Model minervaModel,
+      Collection<SbmlExtension> sbmlExtensions,
       SbmlCompartmentExporter compartmentExporter) {
-    super(layout, minervaModel);
+    super(sbmlModel, minervaModel, sbmlExtensions);
     this.compartmentExporter = compartmentExporter;
   }
 
@@ -30,6 +78,9 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
     if (element.getInitialAmount() != null) {
       result.setInitialAmount(element.getInitialAmount());
     }
+    if (element.getInitialConcentration() != null) {
+      result.setInitialConcentration(element.getInitialConcentration());
+    }
     if (element.hasOnlySubstanceUnits() != null) {
       result.setHasOnlySubstanceUnits(element.hasOnlySubstanceUnits());
     }
@@ -39,9 +90,284 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
     if (element.getConstant() != null) {
       result.setConstant(element.getConstant());
     }
+    if (isExtensionEnabled(SbmlExtension.MULTI)) {
+      assignMultiExtensionData(element, result);
+    }
     return result;
   }
 
+  private void assignMultiExtensionData(Species element, org.sbml.jsbml.Species result) {
+    MultiSpeciesPlugin multiExtension = new MultiSpeciesPlugin(result);
+    MultiSpeciesType speciesType = getMultiSpeciesType(element);
+    multiExtension.setSpeciesType(speciesType.getId());
+    result.addExtension("multi", multiExtension);
+    assignStructuralStateToMulti(element, multiExtension, speciesType);
+    assignPostionToCompartmentToMulti(element, multiExtension, speciesType);
+    assignElementModificationResiduesToMulti(element, multiExtension, speciesType);
+    assignListOfSynonymsToMulti(element, multiExtension, speciesType);
+    assignListOfFormerSymbolsToMulti(element, multiExtension, speciesType);
+    assignSymbolToMulti(element, multiExtension, speciesType);
+    assignFullNameToMulti(element, multiExtension, speciesType);
+    assignFormulaToMulti(element, multiExtension, speciesType);
+    assignDimerToMulti(element, multiExtension, speciesType);
+    assignHypotheticalToMulti(element, multiExtension, speciesType);
+    assignAbbreviationToMulti(element, multiExtension, speciesType);
+    assignChargeToMulti(element, multiExtension, speciesType);
+    assignActivityToMulti(element, multiExtension, speciesType);
+  }
+
+  private void assignElementModificationResiduesToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element instanceof Protein) {
+      assignModificationResiduesToMulti(((Protein) element).getModificationResidues(), multiExtension, speciesType);
+    } else if (element instanceof Gene) {
+      assignModificationResiduesToMulti(((Gene) element).getModificationResidues(), multiExtension, speciesType);
+    } else if (element instanceof Rna) {
+      assignModificationResiduesToMulti(((Rna) element).getRegions(), multiExtension, speciesType);
+    } else if (element instanceof AntisenseRna) {
+      assignModificationResiduesToMulti(((AntisenseRna) element).getRegions(), multiExtension, speciesType);
+    }
+
+  }
+
+  private void assignModificationResiduesToMulti(Collection<ModificationResidue> modificationResidues,
+      MultiSpeciesPlugin multiExtension, MultiSpeciesType speciesType) {
+    for (ModificationResidue mr : modificationResidues) {
+      SpeciesFeatureType feature = null;
+      PossibleSpeciesFeatureValue value;
+
+      if (mr instanceof BindingRegion) {
+        feature = getBindingRegionFeature((BindingRegion) mr, speciesType);
+      } else if (mr instanceof CodingRegion) {
+        feature = getCodingRegionFeature((CodingRegion) mr, speciesType);
+      } else if (mr instanceof ProteinBindingDomain) {
+        feature = getProteinBindingDomainFeature((ProteinBindingDomain) mr, speciesType);
+      } else if (mr instanceof RegulatoryRegion) {
+        feature = getRegulatoryRegionFeature((RegulatoryRegion) mr, speciesType);
+      } else if (mr instanceof TranscriptionSite) {
+        feature = getTranscriptionSiteFeature((TranscriptionSite) mr, speciesType);
+      } else if (mr instanceof ModificationSite) {
+        feature = getModificationSiteFeature((ModificationSite) mr, speciesType);
+      } else if (mr instanceof Residue) {
+        feature = getResidueFeature((Residue) mr, speciesType);
+      } else {
+        logger.warn("Don't know how to export modification: " + mr.getClass());
+      }
+      value = getPosibleFeatureIdByName(mr.getName(), feature);
+      SpeciesFeatureValue featureValue = addSpeciesFeatureValue(multiExtension, feature, value);
+      featureValue.setId(getModificationResidueUniqueId(mr));
+    }
+  }
+
+  private SpeciesFeatureType getCodingRegionFeature(CodingRegion mr, MultiSpeciesType speciesType) {
+    String featureId = MultiPackageNamingUtils.getModificationFeatureId(mr);
+    String featureName = "Coding region";
+    return getOrCreateFeatureById(featureId, featureName, speciesType);
+  }
+
+  private SpeciesFeatureType getBindingRegionFeature(BindingRegion bindingRegion, MultiSpeciesType speciesType) {
+    String featureId = MultiPackageNamingUtils.getModificationFeatureId(bindingRegion);
+    String featureName = "Binding region";
+    return getOrCreateFeatureById(featureId, featureName, speciesType);
+  }
+
+  private SpeciesFeatureType getProteinBindingDomainFeature(ProteinBindingDomain proteinBindingDomain,
+      MultiSpeciesType speciesType) {
+    String featureId = MultiPackageNamingUtils.getModificationFeatureId(proteinBindingDomain);
+    String featureName = "Protein binding domain";
+    return getOrCreateFeatureById(featureId, featureName, speciesType);
+  }
+
+  private SpeciesFeatureType getRegulatoryRegionFeature(RegulatoryRegion regulatoryRegion,
+      MultiSpeciesType speciesType) {
+    String featureId = MultiPackageNamingUtils.getModificationFeatureId(regulatoryRegion);
+    String featureName = "Regulatory region";
+    return getOrCreateFeatureById(featureId, featureName, speciesType);
+  }
+
+  private SpeciesFeatureType getTranscriptionSiteFeature(TranscriptionSite transcriptionSite,
+      MultiSpeciesType speciesType) {
+    String featureId = MultiPackageNamingUtils.getModificationFeatureId(transcriptionSite);
+    String featureName = "Transcription site";
+    return getOrCreateFeatureById(featureId, featureName, speciesType);
+  }
+
+  private SpeciesFeatureType getModificationSiteFeature(ModificationSite modificationSite,
+      MultiSpeciesType speciesType) {
+    String featureId = MultiPackageNamingUtils.getModificationFeatureId(modificationSite);
+    String featureName = "";
+    if (modificationSite.getState() != null) {
+      featureName = modificationSite.getState().getFullName();
+    }
+    return getOrCreateFeatureById(featureId, featureName, speciesType);
+  }
+
+  private SpeciesFeatureType getResidueFeature(Residue residue, MultiSpeciesType speciesType) {
+    String featureId = MultiPackageNamingUtils.getModificationFeatureId(residue);
+    String featureName = "";
+    if (residue.getState() != null) {
+      featureName = residue.getState().getFullName();
+    }
+    return getOrCreateFeatureById(featureId, featureName, speciesType);
+  }
+
+  private SpeciesFeatureType getOrCreateFeatureById(String featureId, String featureName,
+      MultiSpeciesType speciesType) {
+    SpeciesFeatureType feature = speciesType.getSpeciesFeatureType(featureId);
+    if (feature == null) {
+      feature = new SpeciesFeatureType();
+      feature.setName(featureName);
+      feature.setId(featureId);
+      speciesType.getListOfSpeciesFeatureTypes().add(feature);
+    }
+    return feature;
+  }
+
+  private void assignStructuralStateToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    String structuralState = null;
+    if (element instanceof Protein) {
+      structuralState = ((Protein) element).getStructuralState();
+    } else if (element instanceof Complex) {
+      structuralState = ((Complex) element).getStructuralState();
+    }
+    if (structuralState != null) {
+      assignValueToFeature(element, multiExtension, speciesType, structuralState, BioEntityFeature.STRUCTURAL_STATE);
+    }
+  }
+
+  private SpeciesFeatureValue addSpeciesFeatureValue(MultiSpeciesPlugin multiExtension, SpeciesFeatureType fetureType,
+      PossibleSpeciesFeatureValue possibleValue) {
+    SpeciesFeature feature = null;
+    for (SpeciesFeature existingFeature : multiExtension.getListOfSpeciesFeatures()) {
+      if (existingFeature.getSpeciesFeatureType().equals(fetureType.getId())) {
+        feature = existingFeature;
+      }
+    }
+    if (feature == null) {
+      feature = multiExtension.createSpeciesFeature();
+      feature.setSpeciesFeatureType(fetureType.getId());
+    }
+    SpeciesFeatureValue value = new SpeciesFeatureValue();
+    value.setValue(possibleValue.getId());
+    feature.addSpeciesFeatureValue(value);
+    return value;
+  }
+
+  private PossibleSpeciesFeatureValue getPosibleFeatureIdByName(String featureValueName,
+      SpeciesFeatureType speciesFeature) {
+    PossibleSpeciesFeatureValue result = null;
+    for (PossibleSpeciesFeatureValue value : speciesFeature.getListOfPossibleSpeciesFeatureValues()) {
+      if (value.getName().equals(featureValueName)) {
+        result = value;
+      }
+    }
+    if (result == null) {
+      result = addPosibleValueToFeature(speciesFeature, featureValueName);
+    }
+    return result;
+  }
+
+  private void assignPostionToCompartmentToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    String value = MultiPackageNamingUtils.NULL_REPRESENTATION;
+    if (element.getPositionToCompartment() != null) {
+      value = element.getPositionToCompartment().getStringName();
+    }
+    assignValueToFeature(element, multiExtension, speciesType, value, BioEntityFeature.POSITION_TO_COMPARTMENT);
+  }
+
+  private void assignListOfSynonymsToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    for (String synonym : element.getSynonyms()) {
+      assignValueToFeature(element, multiExtension, speciesType, synonym, BioEntityFeature.SYNONYM);
+    }
+  }
+
+  private void assignListOfFormerSymbolsToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    for (String formerSymbol : element.getFormerSymbols()) {
+      assignValueToFeature(element, multiExtension, speciesType, formerSymbol, BioEntityFeature.FORMER_SYMBOL);
+    }
+  }
+
+  private void assignSymbolToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element.getSymbol() != null) {
+      assignValueToFeature(element, multiExtension, speciesType, element.getSymbol(), BioEntityFeature.SYMBOL);
+    }
+  }
+
+  private void assignFullNameToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element.getFullName() != null) {
+      assignValueToFeature(element, multiExtension, speciesType, element.getFullName(), BioEntityFeature.FULL_NAME);
+    }
+  }
+
+  private void assignFormulaToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element.getFormula() != null) {
+      assignValueToFeature(element, multiExtension, speciesType, element.getFormula(), BioEntityFeature.FORMULA);
+    }
+  }
+
+  private void assignDimerToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element.getHomodimer() != 1) {
+      assignValueToFeature(element, multiExtension, speciesType, element.getHomodimer() + "", BioEntityFeature.DIMER);
+    }
+  }
+
+  private void assignChargeToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element.getCharge() != null) {
+      assignValueToFeature(element, multiExtension, speciesType, element.getCharge().toString(),
+          BioEntityFeature.CHARGE);
+    }
+  }
+
+  private void assignHypotheticalToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element.getHypothetical() != null) {
+      assignValueToFeature(element, multiExtension, speciesType, element.getHypothetical().toString(),
+          BioEntityFeature.HYPOTHETICAL);
+    }
+  }
+
+  private void assignActivityToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element.getActivity() != null) {
+      assignValueToFeature(element, multiExtension, speciesType, element.getActivity().toString(),
+          BioEntityFeature.ACTIVITY);
+    }
+  }
+
+  private void assignAbbreviationToMulti(Species element, MultiSpeciesPlugin multiExtension,
+      MultiSpeciesType speciesType) {
+    if (element.getAbbreviation() != null) {
+      assignValueToFeature(element, multiExtension, speciesType, element.getAbbreviation(),
+          BioEntityFeature.ABBREVIATION);
+    }
+  }
+
+  private void assignValueToFeature(Species element, MultiSpeciesPlugin multiExtension, MultiSpeciesType speciesType,
+      String value, BioEntityFeature feature) {
+    SpeciesFeatureType structuralStateFeature = getFeature(element.getClass(), speciesType, feature);
+    PossibleSpeciesFeatureValue structuralStateFeatureValue = getPosibleFeatureIdByName(value,
+        structuralStateFeature);
+
+    addSpeciesFeatureValue(multiExtension, structuralStateFeature, structuralStateFeatureValue);
+  }
+
+  private MultiSpeciesType getMultiSpeciesType(Species element) {
+    MultiSpeciesType speciesType = getMultiPlugin().getSpeciesType(MultiPackageNamingUtils.getSpeciesTypeId(element));
+    if (speciesType == null) {
+      speciesType = createSpeciesTypeForClass(getMultiPlugin(), element.getClass());
+    }
+    return speciesType;
+  }
+
   @Override
   protected AbstractReferenceGlyph createElementGlyph(String sbmlElementId, String glyphId) {
     AbstractReferenceGlyph speciesGlyph = getLayout().createSpeciesGlyph(glyphId, sbmlElementId);
@@ -63,7 +389,53 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
     if (element.getComplex() != null) {
       complexName = element.getComplex().getName();
     }
-    return element.getClass().getSimpleName() + "\n" + element.getName() + "\n" + compartmentName + "\n" + complexName;
+
+    List<String> annotations = new ArrayList<>();
+    for (MiriamData md: element.getMiriamData()) {
+      annotations.add(md.toString());
+    }
+    Collections.sort(annotations);
+    String annotationNames = StringUtils.join(annotations, ",");
+
+    String multiDistinguisher = null;
+    if (isExtensionEnabled(SbmlExtension.MULTI)) {
+      String structuralState = null;
+      if (element instanceof Protein) {
+        structuralState = ((Protein) element).getStructuralState();
+      } else if (element instanceof Complex) {
+        structuralState = ((Complex) element).getStructuralState();
+      }
+      multiDistinguisher = structuralState;
+
+      if (element instanceof SpeciesWithModificationResidue) {
+        List<String> modifications = new ArrayList<>();
+        for (ModificationResidue mr : ((SpeciesWithModificationResidue) element).getModificationResidues()) {
+          String modificationId = mr.getName() + mr.getClass().getSimpleName();
+          if (mr instanceof AbstractSiteModification) {
+            modificationId += ((AbstractSiteModification) mr).getState();
+          }
+          modifications.add(modificationId);
+        }
+        Collections.sort(modifications);
+        multiDistinguisher += "\n" + StringUtils.join(modifications, ",");
+      }
+      multiDistinguisher += "\n" + element.getPositionToCompartment();
+      if (element instanceof Complex) {
+        List<String> complexChildIds = new ArrayList<>();
+        for (Species child : ((Complex) element).getAllChildren()) {
+          complexChildIds.add(getSbmlIdKey(child));
+        }
+        Collections.sort(complexChildIds);
+        multiDistinguisher += "\n" + StringUtils.join(complexChildIds, "\n");
+      }
+      multiDistinguisher += "\n" + element.getActivity();
+      multiDistinguisher += "\n" + element.getCharge();
+      multiDistinguisher += "\n" + element.getHomodimer();
+    }
+    String result = element.getClass().getSimpleName() + "\n" + annotationNames+"\n"+element.getName() + "\n" + compartmentName + "\n"
+        + complexName
+        + "\n" + multiDistinguisher;
+    return result;
   }
 
   protected LocalStyle createStyle(Species element) {
@@ -72,4 +444,117 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
     return style;
   }
 
+  @SuppressWarnings("unchecked")
+  private MultiSpeciesType createSpeciesTypeForClass(MultiModelPlugin multiPlugin, Class<? extends Element> clazz) {
+    MultiSpeciesType speciesType = new MultiSpeciesType();
+    speciesType.setName(clazz.getSimpleName());
+    speciesType.setId(MultiPackageNamingUtils.getSpeciesTypeId(clazz));
+    multiPlugin.getListOfSpeciesTypes().add(speciesType);
+    speciesType.setSBOTerm(SBOTermSpeciesType.getTermByType((Class<? extends Species>) clazz));
+    return speciesType;
+  }
+
+  private SpeciesFeatureType getFeature(Class<? extends Element> clazz, MultiSpeciesType speciesType,
+      BioEntityFeature bioEntityFeature) {
+    SpeciesFeatureType feature = speciesType
+        .getSpeciesFeatureType(MultiPackageNamingUtils.getFeatureId(clazz, bioEntityFeature));
+    if (feature == null) {
+      feature = new SpeciesFeatureType();
+      feature.setName(bioEntityFeature.getFeatureName());
+      feature.setId(MultiPackageNamingUtils.getFeatureId(clazz, bioEntityFeature));
+      if (bioEntityFeature.getDefaultValue() != null) {
+        addPosibleValueToFeature(feature, bioEntityFeature.getDefaultValue());
+      }
+      speciesType.getListOfSpeciesFeatureTypes().add(feature);
+    }
+    return feature;
+  }
+
+  private PossibleSpeciesFeatureValue addPosibleValueToFeature(SpeciesFeatureType feature, String value) {
+    if (value == null) {
+      value = MultiPackageNamingUtils.NULL_REPRESENTATION;
+    }
+
+    PossibleSpeciesFeatureValue result = null;
+    for (PossibleSpeciesFeatureValue existingValue : feature.getListOfPossibleSpeciesFeatureValues()) {
+      if (existingValue.getName().equals(value)) {
+        result = existingValue;
+      }
+    }
+    if (result == null) {
+      result = new PossibleSpeciesFeatureValue();
+      result.setId(feature.getId() + "_" + (idCounter++));
+      result.setName(value);
+      feature.getListOfPossibleSpeciesFeatureValues().add(result);
+    }
+    return result;
+  }
+
+  @Override
+  protected void assignLayoutToGlyph(Species element, AbstractReferenceGlyph speciesGlyph) {
+    super.assignLayoutToGlyph(element, speciesGlyph);
+    if (isExtensionEnabled(SbmlExtension.MULTI)) {
+      if (element instanceof SpeciesWithModificationResidue) {
+        for (ModificationResidue mr : ((SpeciesWithModificationResidue) element).getModificationResidues()) {
+          createModificationGlyph(mr, speciesGlyph);
+        }
+      }
+    }
+  }
+
+  private void createModificationGlyph(ModificationResidue mr, AbstractReferenceGlyph speciesGlyph) {
+    org.sbml.jsbml.Species sbmlSpecies = getSbmlModel().getSpecies(speciesGlyph.getReference());
+
+    MultiSpeciesPlugin speciesExtension = (MultiSpeciesPlugin) sbmlSpecies.getExtension("multi");
+    SpeciesFeature feature = null;
+    String featureTypeId = MultiPackageNamingUtils.getModificationFeatureId(mr);
+    for (SpeciesFeature existingFeature : speciesExtension.getListOfSpeciesFeatures()) {
+      if (existingFeature.getSpeciesFeatureType().equals(featureTypeId)) {
+        feature = existingFeature;
+      }
+    }
+
+    SpeciesFeatureValue modificationFeatureValue = null;
+    for (SpeciesFeatureValue featureValue : feature.getListOfSpeciesFeatureValues()) {
+      if (featureValue.getId().equals(getModificationResidueUniqueId(mr))) {
+        modificationFeatureValue = featureValue;
+      }
+    }
+
+    GeneralGlyph modificationGlyph = getLayout().createGeneralGlyph("modification_" + (idCounter++),
+        modificationFeatureValue.getId());
+    ReferenceGlyph referenceGlyph = new ReferenceGlyph("modification_reference_" + (idCounter++));
+    referenceGlyph.setReference(speciesGlyph.getId());
+    modificationGlyph.addReferenceGlyph(referenceGlyph);
+    double width, height;
+    if (mr instanceof AbstractRegionModification) {
+      width = ((AbstractRegionModification) mr).getWidth();
+      height = ((AbstractRegionModification) mr).getHeight();
+    } else {
+      width = 12;
+      height = 12;
+    }
+    double x = mr.getPosition().getX() - width / 2;
+    double y = mr.getPosition().getY() - height / 2;
+    BoundingBox boundingBox = new BoundingBox();
+    boundingBox.setPosition(new Point(x, y));
+    Dimensions dimensions = new Dimensions();
+    dimensions.setWidth(width);
+    dimensions.setHeight(height);
+    boundingBox.setDimensions(dimensions);
+    modificationGlyph.setBoundingBox(boundingBox);
+  }
+
+  private int modificationResidueCounter = 0;
+  private Map<String, String> modificationResidueIds = new HashMap<>();
+
+  private String getModificationResidueUniqueId(ModificationResidue mr) {
+    String result = modificationResidueIds.get(mr.getIdModificationResidue() + "_" + getSbmlIdKey(mr.getSpecies()));
+    if (result == null) {
+      result = "modification_residue_" + (modificationResidueCounter++);
+      modificationResidueIds.put(mr.getIdModificationResidue() + "_" + getSbmlIdKey(mr.getSpecies()), result);
+    }
+    return result;
+  }
+
 }
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
index fc85d01719fe24672c6cf84bf32d91ac7957d6f9..67aa4b1a5971f381acabd13c9e90edb7bcc3b17b 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
@@ -1,5 +1,6 @@
 package lcsb.mapviewer.converter.model.sbml.species;
 
+import java.awt.geom.Point2D;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
@@ -9,19 +10,54 @@ import org.sbml.jsbml.ListOf;
 import org.sbml.jsbml.Model;
 import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
 import org.sbml.jsbml.ext.layout.CompartmentGlyph;
-import org.sbml.jsbml.ext.layout.Layout;
+import org.sbml.jsbml.ext.layout.GeneralGlyph;
+import org.sbml.jsbml.ext.layout.GraphicalObject;
+import org.sbml.jsbml.ext.layout.ReferenceGlyph;
 import org.sbml.jsbml.ext.layout.SpeciesGlyph;
+import org.sbml.jsbml.ext.multi.MultiModelPlugin;
+import org.sbml.jsbml.ext.multi.MultiSpeciesPlugin;
+import org.sbml.jsbml.ext.multi.MultiSpeciesType;
+import org.sbml.jsbml.ext.multi.OutwardBindingSite;
+import org.sbml.jsbml.ext.multi.PossibleSpeciesFeatureValue;
+import org.sbml.jsbml.ext.multi.SpeciesFeature;
+import org.sbml.jsbml.ext.multi.SpeciesFeatureType;
+import org.sbml.jsbml.ext.multi.SpeciesFeatureValue;
+import org.sbml.jsbml.ext.multi.SpeciesTypeInstance;
+import org.sbml.jsbml.ext.multi.SubListOfSpeciesFeature;
 import org.sbml.jsbml.ext.render.LocalStyle;
 
 import lcsb.mapviewer.common.Pair;
 import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.converter.InvalidInputDataExecption;
 import lcsb.mapviewer.converter.model.sbml.SbmlElementParser;
+import lcsb.mapviewer.converter.model.sbml.extension.multi.BioEntityFeature;
+import lcsb.mapviewer.converter.model.sbml.extension.multi.MultiPackageNamingUtils;
 import lcsb.mapviewer.model.map.compartment.Compartment;
+import lcsb.mapviewer.model.map.species.Complex;
 import lcsb.mapviewer.model.map.species.Degraded;
 import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.Protein;
 import lcsb.mapviewer.model.map.species.Species;
 import lcsb.mapviewer.model.map.species.Unknown;
+import lcsb.mapviewer.model.map.species.field.AbstractRegionModification;
+import lcsb.mapviewer.model.map.species.field.BindingRegion;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.PositionToCompartment;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
+import lcsb.mapviewer.model.map.species.field.RegulatoryRegion;
+import lcsb.mapviewer.model.map.species.field.Residue;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithBindingRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithCodingRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationResidue;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationSite;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithProteinBindingDomain;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithRegulatoryRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithResidue;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithTranscriptionSite;
+import lcsb.mapviewer.model.map.species.field.TranscriptionSite;
+import lcsb.mapviewer.modelutils.map.ElementUtils;
 
 public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species> {
   Logger logger = Logger.getLogger(SbmlSpeciesParser.class);
@@ -29,19 +65,23 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species>
   private static String ARTIFITIAL_SINK_ID = "sbml_artifitial_sink";
   private static String ARTIFITIAL_SOURCE_ID = "sbml_artifitial_source";
 
-  public SbmlSpeciesParser(Layout layout, lcsb.mapviewer.model.map.model.Model minervaModel) {
-    super(layout, minervaModel);
+  public SbmlSpeciesParser(Model model, lcsb.mapviewer.model.map.model.Model minervaModel) {
+    super(model, minervaModel);
   }
 
+  @SuppressWarnings("deprecation")
   @Override
-  protected Species parse(org.sbml.jsbml.Species species, Model sbmlModel) throws InvalidInputDataExecption {
-    String sboTerm = species.getSBOTermID();
+  protected Species parse(org.sbml.jsbml.Species species) throws InvalidInputDataExecption {
+    String sboTerm = extractSBOTermFromSpecies(species);
     Class<? extends Species> clazz = SBOTermSpeciesType.getTypeSBOTerm(sboTerm);
     try {
       Species result = clazz.getConstructor(String.class).newInstance(species.getId());
       if (!Double.isNaN(species.getInitialAmount())) {
         result.setInitialAmount(species.getInitialAmount());
       }
+      if (!Double.isNaN(species.getInitialConcentration())) {
+        result.setInitialConcentration(species.getInitialConcentration());
+      }
       if (species.isSetHasOnlySubstanceUnits()) {
         result.setOnlySubstanceUnits(species.hasOnlySubstanceUnits());
       }
@@ -51,10 +91,16 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species>
       if (species.isSetConstant()) {
         result.setConstant(species.getConstant());
       }
+      if (species.isSetCharge()) {
+        result.setCharge(species.getCharge());
+      }
       assignBioEntityData(species, result);
-      if (layout == null) {
+      if (getLayout() == null) {
         assignCompartment(result, species.getCompartment());
       }
+      if (getMultiPlugin() != null) {
+        assignMultiData(species, result);
+      }
       return result;
     } catch (SecurityException | NoSuchMethodException | InstantiationException | IllegalAccessException
         | IllegalArgumentException | InvocationTargetException e) {
@@ -62,34 +108,331 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species>
     }
   }
 
+  private void assignMultiData(org.sbml.jsbml.Species sbmlSpecies, Species minervaElement) {
+    String warnPrefix = new ElementUtils().getElementTag(minervaElement);
+    MultiModelPlugin multiPlugin = getMultiPlugin();
+    MultiSpeciesPlugin multiExtension = (MultiSpeciesPlugin) sbmlSpecies.getExtension("multi");
+    if (multiExtension != null) {
+      MultiSpeciesType speciesType = multiPlugin.getListOfSpeciesTypes().get(multiExtension.getSpeciesType());
+      if (speciesType == null) {
+        logger.warn(warnPrefix + "Species type not defined in multi extension");
+      } else {
+        for (SpeciesFeature feature : multiExtension.getListOfSpeciesFeatures()) {
+          assignMultiFeatureData(minervaElement, speciesType, feature);
+        }
+        for (OutwardBindingSite site : multiExtension.getListOfOutwardBindingSites()) {
+          logger.warn(
+              warnPrefix + "OutwardBindingSite not supported: " + site.getComponent() + "; " + site.getBindingStatus());
+        }
+        for (SubListOfSpeciesFeature site : multiExtension.getListOfSubListOfSpeciesFeatures()) {
+          logger.warn(
+              warnPrefix + "SubListOfSpeciesFeature not supported: " + site.getComponent());
+        }
+      }
+    }
+  }
+
+  private void assignMultiFeatureData(Species minervaElement, MultiSpeciesType speciesType,
+      SpeciesFeature feature) {
+    String warnPrefix = new ElementUtils().getElementTag(minervaElement);
+    String featureTypeString = feature.getSpeciesFeatureType();
+    List<String> featureValues = getFeatureValues(speciesType, feature);
+    if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.STRUCTURAL_STATE)) {
+      if (minervaElement instanceof Protein) {
+        ((Protein) minervaElement).setStructuralState(String.join("; ", featureValues));
+      } else if (minervaElement instanceof Complex) {
+        ((Complex) minervaElement).setStructuralState(String.join("; ", featureValues));
+      } else {
+        logger.warn(warnPrefix + "Structural state not supported");
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.POSITION_TO_COMPARTMENT)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Position to compartment must have exactly one value");
+      } else {
+        minervaElement.setPositionToCompartment(PositionToCompartment.getByString(featureValues.get(0)));
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.SYNONYM)) {
+      minervaElement.setSynonyms(featureValues);
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.FORMER_SYMBOL)) {
+      minervaElement.setFormerSymbols(featureValues);
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.DIMER)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Dimer must have exactly one value");
+      } else {
+        try {
+          minervaElement.setHomodimer(Integer.parseInt(featureValues.get(0)));
+        } catch (NumberFormatException e) {
+          logger.warn(warnPrefix + "Dimer must have integer value, instead found: " + featureValues.get(0));
+        }
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.CHARGE)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Charge must have exactly one value");
+      } else {
+        try {
+          minervaElement.setCharge(Integer.parseInt(featureValues.get(0)));
+        } catch (NumberFormatException e) {
+          logger.warn(warnPrefix + "Charge must have integer value, instead found: " + featureValues.get(0));
+        }
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.SYMBOL)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Symbol must have exactly one value");
+      } else {
+        minervaElement.setSymbol(featureValues.get(0));
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.FULL_NAME)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Full name must have exactly one value");
+      } else {
+        minervaElement.setFullName(featureValues.get(0));
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.FORMULA)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Formula must have exactly one value");
+      } else {
+        minervaElement.setFormula(featureValues.get(0));
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.ABBREVIATION)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Abbreviation must have exactly one value");
+      } else {
+        minervaElement.setAbbreviation(featureValues.get(0));
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.HYPOTHETICAL)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Hypothetical must have exactly one value");
+      } else {
+        Boolean value = null;
+        if (featureValues.get(0).equalsIgnoreCase("true")) {
+          value = true;
+        } else if (featureValues.get(0).equalsIgnoreCase("false")) {
+          value = false;
+        } else {
+          logger.warn(warnPrefix + "Hypothetical must be true/false value. Found: " + featureValues.get(0));
+        }
+        minervaElement.setHypothetical(value);
+      }
+    } else if (MultiPackageNamingUtils.isFeatureId(featureTypeString, BioEntityFeature.ACTIVITY)) {
+      if (featureValues.size() != 1) {
+        logger.warn(warnPrefix + "Activity must have exactly one value");
+      } else {
+        Boolean value = null;
+        if (featureValues.get(0).equalsIgnoreCase("true")) {
+          value = true;
+        } else if (featureValues.get(0).equalsIgnoreCase("false")) {
+          value = false;
+        } else {
+          logger.warn(warnPrefix + "Activity must be true/false value. Found: " + featureValues.get(0));
+        }
+        minervaElement.setActivity(value);
+      }
+    } else if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString)) {
+      createModificationResidues(minervaElement, speciesType, feature);
+    } else {
+      logger.warn(warnPrefix + "Feature not supported: " + featureTypeString);
+    }
+  }
+
+  private List<String> getFeatureValues(MultiSpeciesType speciesType, SpeciesFeature feature) {
+    SpeciesFeatureType featureType = speciesType.getListOfSpeciesFeatureTypes().get(feature.getSpeciesFeatureType());
+
+    List<String> result = new ArrayList<>();
+    if (featureType != null) {
+      for (SpeciesFeatureValue featureValue : feature.getListOfSpeciesFeatureValues()) {
+        PossibleSpeciesFeatureValue possibleSpeciesFeatureValue = featureType.getListOfPossibleSpeciesFeatureValues()
+            .get(featureValue.getValue());
+        if (possibleSpeciesFeatureValue.getName().equals(MultiPackageNamingUtils.NULL_REPRESENTATION)) {
+          result.add(null);
+        } else {
+          result.add(possibleSpeciesFeatureValue.getName());
+        }
+      }
+    } else {
+      for (SpeciesTypeInstance speciesTypeInstance : speciesType.getListOfSpeciesTypeInstances()) {
+        speciesType = getMultiPlugin().getSpeciesType(speciesTypeInstance.getSpeciesType());
+        result = getFeatureValues(speciesType, feature);
+        if (result.size() > 0) {
+          return result;
+        }
+      }
+
+    }
+    return result;
+  }
+
+  private void createModificationResidues(Species minervaElement, MultiSpeciesType speciesType,
+      SpeciesFeature feature) {
+    String warnPrefix = new ElementUtils().getElementTag(minervaElement);
+    ModificationResidue mr = null;
+
+    String featureTypeString = feature.getSpeciesFeatureType();
+    SpeciesFeatureType featureType = speciesType.getListOfSpeciesFeatureTypes().get(featureTypeString);
+    for (SpeciesFeatureValue featureValue : feature.getListOfSpeciesFeatureValues()) {
+      if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString, BindingRegion.class)) {
+        mr = new BindingRegion();
+        if (minervaElement instanceof SpeciesWithBindingRegion) {
+          ((SpeciesWithBindingRegion) minervaElement).addBindingRegion((BindingRegion) mr);
+        } else {
+          logger.warn(warnPrefix + "Object class doesn't support " + mr.getClass());
+        }
+      } else if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString, CodingRegion.class)) {
+        mr = new CodingRegion();
+        if (minervaElement instanceof SpeciesWithCodingRegion) {
+          ((SpeciesWithCodingRegion) minervaElement).addCodingRegion((CodingRegion) mr);
+        } else {
+          logger.warn(warnPrefix + "Object class doesn't support " + mr.getClass());
+        }
+      } else if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString, ProteinBindingDomain.class)) {
+        mr = new ProteinBindingDomain();
+        if (minervaElement instanceof SpeciesWithProteinBindingDomain) {
+          ((SpeciesWithProteinBindingDomain) minervaElement).addProteinBindingDomain((ProteinBindingDomain) mr);
+        } else {
+          logger.warn(warnPrefix + "Object class doesn't support " + mr.getClass());
+        }
+      } else if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString, RegulatoryRegion.class)) {
+        mr = new RegulatoryRegion();
+        if (minervaElement instanceof SpeciesWithRegulatoryRegion) {
+          ((SpeciesWithRegulatoryRegion) minervaElement).addRegulatoryRegion((RegulatoryRegion) mr);
+        } else {
+          logger.warn(warnPrefix + "Object class doesn't support " + mr.getClass());
+        }
+      } else if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString, TranscriptionSite.class)) {
+        mr = new TranscriptionSite();
+        if (minervaElement instanceof SpeciesWithTranscriptionSite) {
+          TranscriptionSite transcriptionSite = (TranscriptionSite) mr;
+          transcriptionSite.setActive(
+              MultiPackageNamingUtils.getTranscriptionFactorActiveStateFromFeatureTypeName(featureTypeString));
+          transcriptionSite.setDirection(
+              MultiPackageNamingUtils.getTranscriptionFactorDirectionStateFromFeatureTypeName(featureTypeString));
+          ((SpeciesWithTranscriptionSite) minervaElement).addTranscriptionSite(transcriptionSite);
+        } else {
+          logger.warn(warnPrefix + "Object class doesn't support " + mr.getClass());
+        }
+      } else if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString, ModificationSite.class)) {
+        mr = new ModificationSite();
+        ((ModificationSite) mr)
+            .setState(MultiPackageNamingUtils.getModificationStateFromFeatureTypeName(featureTypeString));
+        if (minervaElement instanceof SpeciesWithModificationSite) {
+          ((SpeciesWithModificationSite) minervaElement).addModificationSite((ModificationSite) mr);
+        } else {
+          logger.warn(warnPrefix + "Object class doesn't support " + mr.getClass());
+        }
+      } else if (MultiPackageNamingUtils.isModificationFeatureId(featureTypeString, Residue.class)) {
+        mr = new Residue();
+        ((Residue) mr)
+            .setState(MultiPackageNamingUtils.getModificationStateFromFeatureTypeName(featureTypeString));
+        if (minervaElement instanceof SpeciesWithResidue) {
+          ((SpeciesWithResidue) minervaElement).addResidue((Residue) mr);
+        } else {
+          logger.warn(warnPrefix + "Object class doesn't support " + mr.getClass());
+        }
+      } else {
+        logger.warn(warnPrefix + "Unsupported modification type: " + featureTypeString);
+      }
+      PossibleSpeciesFeatureValue possibleSpeciesFeatureValue = featureType.getListOfPossibleSpeciesFeatureValues()
+          .get(featureValue.getValue());
+      if (possibleSpeciesFeatureValue != null) {
+        mr.setName(possibleSpeciesFeatureValue.getName());
+        mr.setIdModificationResidue(featureValue.getId());
+      } else {
+        logger.warn(warnPrefix + "Invalid feature value: " + featureValue.getValue());
+      }
+    }
+
+  }
+
+  private String extractSBOTermFromSpecies(org.sbml.jsbml.Species species) {
+    String sboTerm = species.getSBOTermID();
+    MultiSpeciesPlugin multiExtension = (MultiSpeciesPlugin) species.getExtension("multi");
+    if (multiExtension != null) {
+      MultiSpeciesType speciesType = getMultiPlugin().getListOfSpeciesTypes().get(multiExtension.getSpeciesType());
+      if (speciesType != null) {
+        String sboTerm2 = speciesType.getSBOTermID();
+        if (sboTerm != null && !sboTerm.isEmpty() && !sboTerm2.equals(sboTerm)) {
+          logger.warn("Different SBO terms defining species and speciesType: " + species.getId() + ". " + sboTerm + ";"
+              + sboTerm2);
+        } else {
+          sboTerm = sboTerm2;
+        }
+      }
+    }
+    return sboTerm;
+  }
+
   @Override
-  public List<Element> mergeLayout(List<? extends Element> elements, Layout sbmlLayout, Model sbmlModel)
+  public List<Element> mergeLayout(List<? extends Element> elements)
       throws InvalidInputDataExecption {
-    List<Element> result = super.mergeLayout(elements, sbmlLayout, sbmlModel);
+    List<Element> result = super.mergeLayout(elements);
 
     for (Element element : result) {
       String compartmentId = null;
-      if (sbmlLayout.getSpeciesGlyph(element.getElementId()) != null) {
-        compartmentId = ((org.sbml.jsbml.Species) sbmlLayout.getSpeciesGlyph(element.getElementId())
+      if (getLayout().getSpeciesGlyph(element.getElementId()) != null) {
+        compartmentId = ((org.sbml.jsbml.Species) getLayout().getSpeciesGlyph(element.getElementId())
             .getSpeciesInstance()).getCompartment();
       } else {
         if (!element.getElementId().equals(ARTIFITIAL_SINK_ID)
             && !element.getElementId().equals(ARTIFITIAL_SOURCE_ID)) {
-          compartmentId = sbmlModel.getSpecies(element.getElementId()).getCompartment();
+          compartmentId = getSbmlModel().getSpecies(element.getElementId()).getCompartment();
         }
       }
       assignCompartment(element, compartmentId);
+      assignModificationResiduesLayout(element);
     }
     return result;
   }
 
+  private void assignModificationResiduesLayout(Element element) {
+    if (element instanceof SpeciesWithModificationResidue) {
+      for (ModificationResidue mr : ((SpeciesWithModificationResidue) element).getModificationResidues()) {
+        GeneralGlyph residueGlyph = getResidueGlyphForModification(mr);
+        if (residueGlyph != null) {
+          if (residueGlyph.getBoundingBox() == null || residueGlyph.getBoundingBox().getDimensions() == null) {
+            logger.warn(new ElementUtils().getElementTag(mr) + "Layout doesn't contain coordinates");
+          } else {
+            double width = residueGlyph.getBoundingBox().getDimensions().getWidth();
+            double height = residueGlyph.getBoundingBox().getDimensions().getHeight();
+            double x = residueGlyph.getBoundingBox().getPosition().getX();
+            double y = residueGlyph.getBoundingBox().getPosition().getY();
+            mr.setPosition(new Point2D.Double(x + width / 2, y + height / 2));
+            if (mr instanceof AbstractRegionModification) {
+              ((AbstractRegionModification) mr).setWidth(width);
+              ((AbstractRegionModification) mr).setHeight(height);
+            }
+          }
+        }
+      }
+    }
+
+  }
+
+  private GeneralGlyph getResidueGlyphForModification(ModificationResidue mr) {
+    GeneralGlyph residueGlyph = null;
+    for (GraphicalObject graphicalObject : getLayout().getListOfAdditionalGraphicalObjects()) {
+      if (graphicalObject instanceof GeneralGlyph) {
+        if (((GeneralGlyph) graphicalObject).getReference().equals(mr.getIdModificationResidue())) {
+          if (((GeneralGlyph) graphicalObject).getListOfReferenceGlyphs().size() > 0) {
+            // find a reference to the alias in layout, so we know it's the proper value
+            ReferenceGlyph referenceGlyph = ((GeneralGlyph) graphicalObject).getListOfReferenceGlyphs().get(0);
+            if (referenceGlyph.getReference().equals(mr.getSpecies().getElementId())) {
+              residueGlyph = (GeneralGlyph) graphicalObject;
+            }
+          } else {
+            residueGlyph = (GeneralGlyph) graphicalObject;
+          }
+        }
+      }
+    }
+    return residueGlyph;
+  }
+
   private void assignCompartment(Element element, String compartmentId) {
-    Compartment compartment = minervaModel.getElementByElementId(compartmentId);
-    if (compartment == null && layout != null) {
+    Compartment compartment = getMinervaModel().getElementByElementId(compartmentId);
+    if (compartment == null && getLayout() != null) {
       List<Compartment> compartments = new ArrayList<>();
-      for (CompartmentGlyph glyph : layout.getListOfCompartmentGlyphs()) {
+      for (CompartmentGlyph glyph : getLayout().getListOfCompartmentGlyphs()) {
         if (glyph.getCompartment().equals(compartmentId) && !glyph.getCompartment().equals("default")) {
-          compartments.add(minervaModel.getElementByElementId(glyph.getId()));
+          compartments.add(getMinervaModel().getElementByElementId(glyph.getId()));
         }
       }
       for (Compartment compartment2 : compartments) {
@@ -106,14 +449,14 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species>
   }
 
   @Override
-  protected ListOf<org.sbml.jsbml.Species> getSbmlElementList(Model sbmlModel) {
-    return sbmlModel.getListOfSpecies();
+  protected ListOf<org.sbml.jsbml.Species> getSbmlElementList() {
+    return getSbmlModel().getListOfSpecies();
   }
 
   @Override
-  protected List<Pair<String, AbstractReferenceGlyph>> getGlyphs(Layout sbmlLayout) {
+  protected List<Pair<String, AbstractReferenceGlyph>> getGlyphs() {
     List<Pair<String, AbstractReferenceGlyph>> result = new ArrayList<>();
-    for (SpeciesGlyph glyph : sbmlLayout.getListOfSpeciesGlyphs()) {
+    for (SpeciesGlyph glyph : getLayout().getListOfSpeciesGlyphs()) {
       result.add(new Pair<String, AbstractReferenceGlyph>(glyph.getSpecies(), glyph));
     }
     return result;
@@ -129,21 +472,21 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species>
   }
 
   public Species getArtifitialInput() {
-    Species result = minervaModel.getElementByElementId(ARTIFITIAL_SOURCE_ID);
+    Species result = getMinervaModel().getElementByElementId(ARTIFITIAL_SOURCE_ID);
     if (result == null) {
       result = new Unknown(ARTIFITIAL_SOURCE_ID);
       result.setName("Artifitial source");
-      minervaModel.addElement(result);
+      getMinervaModel().addElement(result);
     }
     return result;
   }
 
   public Species getArtifitialOutput() {
-    Species result = minervaModel.getElementByElementId(ARTIFITIAL_SINK_ID);
+    Species result = getMinervaModel().getElementByElementId(ARTIFITIAL_SINK_ID);
     if (result == null) {
       result = new Degraded(ARTIFITIAL_SINK_ID);
       result.setName("Artifitial sink");
-      minervaModel.addElement(result);
+      getMinervaModel().addElement(result);
     }
     return result;
   }
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/units/SbmlUnitsParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/units/SbmlUnitsParser.java
index bd5ad0057638392210912b66caf947d1a49dbd27..c7411879da61918e4bf5319abf0cc41af5912328 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/units/SbmlUnitsParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/units/SbmlUnitsParser.java
@@ -16,8 +16,8 @@ import lcsb.mapviewer.model.map.kinetics.SbmlUnitTypeFactor;
 public class SbmlUnitsParser extends SbmlBioEntityParser {
   Logger logger = Logger.getLogger(SbmlUnitsParser.class);
 
-  public SbmlUnitsParser(lcsb.mapviewer.model.map.model.Model minervaModel) {
-    this.minervaModel = minervaModel;
+  public SbmlUnitsParser(Model sbmlModel, lcsb.mapviewer.model.map.model.Model minervaModel) {
+    super(sbmlModel, minervaModel);
   }
 
   protected SbmlUnit parse(org.sbml.jsbml.UnitDefinition unitDefinition, Model sbmlModel) {
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java
index a4ee68a74ff8a97f533dd669f07fc5d639a17bae..922a00eb38e98d476a0bc91beebf1acf633d727a 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java
@@ -12,6 +12,12 @@ import lcsb.mapviewer.converter.model.sbml.species.AllSbmlSpeciesTests;
     AllSbmlSpeciesTests.class,
     GenericSbmlParserTest.class,
     GenericSbmlToXmlParserTest.class,
+    CellDesignerToMultiExportTest.class,
+    ElementPropertiesExport.class,
+    ElementPropertiesExportToMultiTest.class,
+    ElementPropertiesExportToLayoutTest.class,
+    MultiParserTest.class,
+    ReactionPropertiesExportToMultiTest.class,
     SbmlBioEntityExporterTest.class,
     SbmlExporterTest.class,
     SbmlExporterFromCellDesignerTest.class,
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/CellDesignerToMultiExportTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/CellDesignerToMultiExportTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e49c0cad4aff2fb9e3276aabc6deef3389c97595
--- /dev/null
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/CellDesignerToMultiExportTest.java
@@ -0,0 +1,77 @@
+package lcsb.mapviewer.converter.model.sbml;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.log4j.Logger;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import lcsb.mapviewer.converter.ConverterParams;
+import lcsb.mapviewer.converter.IConverter;
+import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.model.ModelComparator;
+
+@RunWith(Parameterized.class)
+public class CellDesignerToMultiExportTest {
+
+  static Logger logger = Logger.getLogger(CellDesignerToMultiExportTest.class.getName());
+
+  private Path filePath;
+
+  public CellDesignerToMultiExportTest(Path filePath) {
+    this.filePath = filePath;
+  }
+
+  @Parameters(name = "{index} : {0}")
+  public static Collection<Object[]> data() throws IOException {
+    Collection<Object[]> data = new ArrayList<Object[]>();
+    Files.walk(Paths.get("testFiles/cd_for_multi")).forEach(fPath -> {
+      if (Files.isRegularFile(fPath) && fPath.toString().endsWith(".xml")) {
+        data.add(new Object[] { fPath });
+      }
+    });
+    return data;
+  }
+
+  @Test
+  public void createModelTest() throws Exception {
+    try {
+      IConverter converter = new CellDesignerXmlParser();
+
+      Model model = converter.createModel(new ConverterParams().filename(filePath.toString()));
+      model.setName(null);
+
+      SbmlExporter sbmlExporter = new SbmlExporter();
+      SbmlParser sbmlParser = new SbmlParser();
+      String xmlString = sbmlExporter.toXml(model);
+
+      InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
+
+      Model model2 = sbmlParser.createModel(new ConverterParams().inputStream(is).sizeAutoAdjust(false));
+      model2.setName(null);
+
+      assertNotNull(model2);
+      ModelComparator comparator = new ModelComparator(1.0);
+      assertEquals(0, comparator.compare(model, model2));
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+  
+}
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExport.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExport.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad50425e0a0db6263e08b936282c0ce1ca74ca85
--- /dev/null
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExport.java
@@ -0,0 +1,101 @@
+package lcsb.mapviewer.converter.model.sbml;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.log4j.Logger;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import lcsb.mapviewer.converter.ConverterParams;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.model.ModelComparator;
+import lcsb.mapviewer.model.map.model.ModelFullIndexed;
+import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.GenericProtein;
+import lcsb.mapviewer.model.map.species.Species;
+
+@RunWith(Parameterized.class)
+public class ElementPropertiesExport {
+
+  static Logger logger = Logger.getLogger(ElementPropertiesExport.class.getName());
+
+  private Model model;
+
+  public ElementPropertiesExport(String propertyName, Model model) {
+    this.model = model;
+  }
+
+  @Parameters(name = "{index} : {0}")
+  public static Collection<Object[]> data() throws IOException {
+    Collection<Object[]> data = new ArrayList<>();
+
+    data.add(createTestEntry("Empty", createElement()));
+
+    Species element = createElement();
+    element.setInitialConcentration(1.0);
+    data.add(createTestEntry("Initial concentration", element));
+
+    element = createElement();
+    element.setInitialAmount(2.0);
+    data.add(createTestEntry("Initial amount", element));
+
+    element = createElement();
+    element.setBoundaryCondition(true);
+    data.add(createTestEntry("Boundary condition", element));
+
+    element = createElement();
+    element.setConstant(true);
+    data.add(createTestEntry("Constatnt", element));
+
+    return data;
+  }
+
+  private static Object[] createTestEntry(String string, Element element) {
+    Model result = new ModelFullIndexed(null);
+    result.setIdModel("X");
+    result.setWidth(200);
+    result.setHeight(200);
+    result.addElement(element);
+    return new Object[] { string, result };
+  }
+
+  private static Species createElement() {
+    Species element = new GenericProtein("id");
+    element.setX(10);
+    element.setY(10);
+    element.setWidth(1000);
+    element.setHeight(30);
+    return element;
+  }
+
+  @Test
+  public void createModelTest() throws Exception {
+    try {
+      SbmlExporter sbmlExporter = new SbmlExporter();
+      SbmlParser sbmlParser = new SbmlParser();
+      String xmlString = sbmlExporter.toXml(model);
+      logger.debug(xmlString);
+
+      InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
+
+      Model model2 = sbmlParser.createModel(new ConverterParams().inputStream(is).sizeAutoAdjust(false));
+      model2.setName(model.getName());
+
+      ModelComparator comparator = new ModelComparator();
+      assertEquals(0, comparator.compare(model, model2));
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+}
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExportToLayoutTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExportToLayoutTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c062b021cd6e048629aa9089ff53185191af612
--- /dev/null
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExportToLayoutTest.java
@@ -0,0 +1,88 @@
+package lcsb.mapviewer.converter.model.sbml;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.log4j.Logger;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import lcsb.mapviewer.converter.ConverterParams;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.model.ModelComparator;
+import lcsb.mapviewer.model.map.model.ModelFullIndexed;
+import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.GenericProtein;
+import lcsb.mapviewer.model.map.species.Species;
+
+@RunWith(Parameterized.class)
+public class ElementPropertiesExportToLayoutTest {
+
+  static Logger logger = Logger.getLogger(ElementPropertiesExportToLayoutTest.class.getName());
+
+  private Model model;
+
+  public ElementPropertiesExportToLayoutTest(String propertyName, Model model) {
+    this.model = model;
+  }
+
+  @Parameters(name = "{index} : {0}")
+  public static Collection<Object[]> data() throws IOException {
+    Collection<Object[]> data = new ArrayList<>();
+
+    data.add(createTestEntry("Empty", createElement()));
+
+    Species element = createElement();
+    element.setFontSize(40);
+    data.add(createTestEntry("Font size", element));
+
+    return data;
+  }
+
+  private static Object[] createTestEntry(String string, Element element) {
+    Model result = new ModelFullIndexed(null);
+    result.setIdModel("X");
+    result.setWidth(200);
+    result.setHeight(200);
+    result.addElement(element);
+    return new Object[] { string, result };
+  }
+
+  private static Species createElement() {
+    Species element = new GenericProtein("id");
+    element.setX(10);
+    element.setY(10);
+    element.setWidth(1000);
+    element.setHeight(30);
+    return element;
+  }
+
+  @Test
+  public void createModelTest() throws Exception {
+    try {
+      SbmlExporter sbmlExporter = new SbmlExporter();
+      SbmlParser sbmlParser = new SbmlParser();
+      String xmlString = sbmlExporter.toXml(model);
+
+      InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
+
+      Model model2 = sbmlParser.createModel(new ConverterParams().inputStream(is).sizeAutoAdjust(false));
+      model2.setName(model.getName());
+
+      ModelComparator comparator = new ModelComparator();
+      assertEquals(0, comparator.compare(model, model2));
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+}
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExportToMultiTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExportToMultiTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d9bdefc23859caf5831f4395d488406d30efb9d2
--- /dev/null
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ElementPropertiesExportToMultiTest.java
@@ -0,0 +1,125 @@
+package lcsb.mapviewer.converter.model.sbml;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.log4j.Logger;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import lcsb.mapviewer.converter.ConverterParams;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.model.ModelComparator;
+import lcsb.mapviewer.model.map.model.ModelFullIndexed;
+import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.GenericProtein;
+import lcsb.mapviewer.model.map.species.Species;
+
+@RunWith(Parameterized.class)
+public class ElementPropertiesExportToMultiTest {
+
+  static Logger logger = Logger.getLogger(ElementPropertiesExportToMultiTest.class.getName());
+
+  private Model model;
+
+  public ElementPropertiesExportToMultiTest(String propertyName, Model model) {
+    this.model = model;
+  }
+
+  @Parameters(name = "{index} : {0}")
+  public static Collection<Object[]> data() throws IOException {
+    Collection<Object[]> data = new ArrayList<>();
+
+    data.add(createTestEntry("Empty", createElement()));
+
+    Species element = createElement();
+    element.setAbbreviation("xyz");
+    data.add(createTestEntry("Abbreviation", element));
+
+    element = createElement();
+    element.setFormerSymbols(Arrays.asList(new String[] { "symbol 1", "s2" }));
+    data.add(createTestEntry("Former Symbols", element));
+
+    element = createElement();
+    element.setFormula("C2H5OH");
+    data.add(createTestEntry("Formula", element));
+
+    element = createElement();
+    element.setFullName("Amazing element");
+    data.add(createTestEntry("Full name", element));
+
+    element = createElement();
+    element.setHomodimer(4);
+    data.add(createTestEntry("Homodimer", element));
+
+    element = createElement();
+    element.setCharge(5);
+    data.add(createTestEntry("Charge", element));
+
+    element = createElement();
+    element.setHypothetical(true);
+    data.add(createTestEntry("Hypothetical", element));
+
+    element = createElement();
+    element.setActivity(true);
+    data.add(createTestEntry("Activity", element));
+
+    element = createElement();
+    element.setSymbol("H2O");
+    data.add(createTestEntry("Symbol", element));
+
+    element = createElement();
+    element.setSynonyms(Arrays.asList(new String[] { "syn 1", "s2" }));
+    data.add(createTestEntry("Synonyms", element));
+
+    return data;
+  }
+
+  private static Object[] createTestEntry(String string, Element element) {
+    Model result = new ModelFullIndexed(null);
+    result.setIdModel("X");
+    result.setWidth(200);
+    result.setHeight(200);
+    result.addElement(element);
+    return new Object[] { string, result };
+  }
+
+  private static Species createElement() {
+    Species element = new GenericProtein("id");
+    element.setX(10);
+    element.setY(10);
+    element.setWidth(1000);
+    element.setHeight(30);
+    return element;
+  }
+
+  @Test
+  public void createModelTest() throws Exception {
+    try {
+      SbmlExporter sbmlExporter = new SbmlExporter();
+      SbmlParser sbmlParser = new SbmlParser();
+      String xmlString = sbmlExporter.toXml(model);
+
+      InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
+
+      Model model2 = sbmlParser.createModel(new ConverterParams().inputStream(is).sizeAutoAdjust(false));
+      model2.setName(model.getName());
+
+      ModelComparator comparator = new ModelComparator();
+      assertEquals(0, comparator.compare(model, model2));
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+}
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/GenericSbmlToXmlParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/GenericSbmlToXmlParserTest.java
index f9e8649a5ae70a6e55361d44a92daf70db95c901..10843990e94ec0bbd610c4e67b643ff68eba32c0 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/GenericSbmlToXmlParserTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/GenericSbmlToXmlParserTest.java
@@ -22,7 +22,6 @@ import lcsb.mapviewer.converter.ConverterParams;
 import lcsb.mapviewer.converter.IConverter;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.model.ModelComparator;
-import lcsb.mapviewer.model.map.reaction.Reaction;
 
 @RunWith(Parameterized.class)
 public class GenericSbmlToXmlParserTest {
@@ -66,7 +65,7 @@ public class GenericSbmlToXmlParserTest {
           + filePath.getFileName().toString().substring(0, filePath.getFileName().toString().indexOf(".xml"));
       String xmlFilePath = pathWithouExtension.concat(".xml");
       converter.exportModelToFile(model, xmlFilePath);
-      
+
       Model model2 = converter.createModel(new ConverterParams().filename(xmlFilePath).sizeAutoAdjust(false));
       model2.setName(null);
 
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/MultiParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/MultiParserTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9636bdb54b4c1a4e069e0502ef8cfa6086f2e8b7
--- /dev/null
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/MultiParserTest.java
@@ -0,0 +1,99 @@
+package lcsb.mapviewer.converter.model.sbml;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.log4j.Logger;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import lcsb.mapviewer.converter.ConverterParams;
+import lcsb.mapviewer.converter.IConverter;
+import lcsb.mapviewer.converter.graphics.AbstractImageGenerator;
+import lcsb.mapviewer.converter.graphics.NormalImageGenerator;
+import lcsb.mapviewer.converter.graphics.PngImageGenerator;
+import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.model.ModelComparator;
+
+@RunWith(Parameterized.class)
+public class MultiParserTest {
+
+  static Logger logger = Logger.getLogger(MultiParserTest.class.getName());
+
+  private Path filePath;
+
+  public MultiParserTest(Path filePath) {
+    this.filePath = filePath;
+  }
+
+  @Parameters(name = "{index} : {0}")
+  public static Collection<Object[]> data() throws IOException {
+    Collection<Object[]> data = new ArrayList<Object[]>();
+    Files.walk(Paths.get("testFiles/multi")).forEach(fPath -> {
+      if (Files.isRegularFile(fPath) && fPath.toString().endsWith(".xml")) {
+        data.add(new Object[] { fPath });
+      }
+    });
+    return data;
+  }
+
+  @Test
+  public void createModelTest() throws Exception {
+    try {
+      String dir = Files.createTempDirectory("sbml-temp-images-dir").toFile().getAbsolutePath();
+
+      IConverter converter = new SbmlParser();
+
+      Model model = converter.createModel(new ConverterParams().filename(filePath.toString()));
+      model.setName(null);
+
+      // Create and display image of parsed map
+      AbstractImageGenerator.Params params = new AbstractImageGenerator.Params().height(model.getHeight())
+          .width(model.getWidth()).nested(true).scale(1).level(20).x(0).y(0).model(model);
+      NormalImageGenerator nig = new PngImageGenerator(params);
+      String pathWithouExtension = dir + "/"
+          + filePath.getFileName().toString().substring(0, filePath.getFileName().toString().indexOf(".xml"));
+      String pngFilePath = pathWithouExtension.concat(".png");
+      nig.saveToFile(pngFilePath);
+      // Desktop.getDesktop().open(new File(pngFilePath));
+
+      CellDesignerXmlParser cellDesignerXmlParser = new CellDesignerXmlParser();
+      String xmlString = cellDesignerXmlParser.toXml(model);
+
+      InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
+
+      Model model2 = cellDesignerXmlParser.createModel(new ConverterParams().inputStream(is).sizeAutoAdjust(false));
+
+      AbstractImageGenerator.Params params2 = new AbstractImageGenerator.Params().height(model2.getHeight())
+          .width(model2.getWidth()).nested(true).scale(1).level(20).x(0).y(0).model(model2);
+      NormalImageGenerator nig2 = new PngImageGenerator(params2);
+      String pngFilePath2 = pathWithouExtension.concat("_2.png");
+      nig2.saveToFile(pngFilePath2);
+
+      assertNotNull(model2);
+      ModelComparator comparator = new ModelComparator(1.0);
+      assertEquals(0, comparator.compare(model, model2));
+      FileUtils.deleteDirectory(new File(dir));
+
+    } catch (Exception e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+}
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ReactionPropertiesExportToMultiTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ReactionPropertiesExportToMultiTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6e7faca96ceeff0c3a15e8cb67d64acf0daac83
--- /dev/null
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/ReactionPropertiesExportToMultiTest.java
@@ -0,0 +1,167 @@
+package lcsb.mapviewer.converter.model.sbml;
+
+import static org.junit.Assert.assertEquals;
+
+import java.awt.geom.Point2D;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.log4j.Logger;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import lcsb.mapviewer.converter.ConverterParams;
+import lcsb.mapviewer.model.graphics.PolylineData;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.model.ModelComparator;
+import lcsb.mapviewer.model.map.model.ModelFullIndexed;
+import lcsb.mapviewer.model.map.reaction.Product;
+import lcsb.mapviewer.model.map.reaction.Reactant;
+import lcsb.mapviewer.model.map.reaction.Reaction;
+import lcsb.mapviewer.model.map.reaction.ReactionNode;
+import lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction;
+import lcsb.mapviewer.model.map.species.Ion;
+
+@Ignore("Not supported by multi extension")
+@RunWith(Parameterized.class)
+public class ReactionPropertiesExportToMultiTest {
+
+  static Logger logger = Logger.getLogger(ReactionPropertiesExportToMultiTest.class.getName());
+
+  private Model model;
+  private static String reactionId = "reactionId";
+
+  public ReactionPropertiesExportToMultiTest(String propertyName, Model model) {
+    this.model = model;
+  }
+
+  @Parameters(name = "{index} : {0}")
+  public static Collection<Object[]> data() throws IOException {
+    Collection<Object[]> data = new ArrayList<>();
+
+    data.add(createTestEntry("Empty", createReaction()));
+
+    Reaction reaction = createReaction();
+    reaction.setAbbreviation("xyz");
+    data.add(createTestEntry("Abbreviation", reaction));
+
+    reaction = createReaction();
+    reaction.setMechanicalConfidenceScore(1);
+    data.add(createTestEntry("Mechanical Confidence Score", reaction));
+
+    reaction = createReaction();
+    reaction.setSubsystem("sub system");
+    data.add(createTestEntry("Subsystem", reaction));
+
+    reaction = createReaction();
+    reaction.setFormula("C2H5OH");
+    data.add(createTestEntry("Formula", reaction));
+
+    reaction = createReaction();
+    reaction.setGeneProteinReaction("some magic string");
+    data.add(createTestEntry("Gene Protein Reaction", reaction));
+
+    reaction = createReaction();
+    reaction.setLowerBound(12.0);
+    data.add(createTestEntry("Lower bound", reaction));
+
+    reaction = createReaction();
+    reaction.setUpperBound(13.0);
+    data.add(createTestEntry("Upper bound", reaction));
+
+    reaction = createReaction();
+    reaction.setSymbol("H2O");
+    data.add(createTestEntry("Symbol", reaction));
+
+    reaction = createReaction();
+    reaction.setSynonyms(Arrays.asList(new String[] { "syn 1", "s2" }));
+    data.add(createTestEntry("Synonyms", reaction));
+
+    return data;
+  }
+
+  private static Reaction createReaction() {
+    Reaction reactionm = new StateTransitionReaction();
+
+    Ion ion = createIon(1);
+    Ion ion2 = createIon(2);
+
+    reactionm.setIdReaction(reactionId);
+    reactionm.addReactant(createReactant(ion));
+    reactionm.addProduct(createProduct(ion2));
+
+    return reactionm;
+  }
+
+  private static Reactant createReactant(Ion ion) {
+    Reactant result = new Reactant(ion);
+    Point2D point = ion.getCenter();
+    point.setLocation(point.getX() + 300, point.getY());
+    result.setLine(new PolylineData(ion.getCenter(), point));
+    return result;
+  }
+
+  private static Product createProduct(Ion ion) {
+    Product result = new Product(ion);
+    Point2D point = ion.getCenter();
+    point.setLocation(point.getX() + 300, point.getY());
+    result.setLine(new PolylineData(ion.getCenter(), point));
+    return result;
+  }
+
+  private static Ion createIon(int id) {
+    Ion ion = new Ion("x" + id);
+    ion.setName("ion " + id);
+    ion.setWidth(100);
+    ion.setHeight(100);
+    ion.setX(200 * (id % 2 + 1));
+    ion.setY(50 * (id / 2 + 1));
+    ion.setOnlySubstanceUnits(true);
+    ion.setConstant(true);
+    ion.setInitialAmount(2.0);
+    ion.setBoundaryCondition(true);
+    return ion;
+  }
+
+  private static Object[] createTestEntry(String string, Reaction element) {
+    Model result = new ModelFullIndexed(null);
+    result.setIdModel("X");
+    result.setWidth(200);
+    result.setHeight(200);
+    for (ReactionNode node : ((Reaction) element).getReactionNodes()) {
+      result.addElement(node.getElement());
+    }
+    result.addReaction((Reaction) element);
+    return new Object[] { string, result };
+  }
+
+  @Test
+  public void createModelTest() throws Exception {
+    try {
+      SbmlExporter sbmlExporter = new SbmlExporter();
+      SbmlParser sbmlParser = new SbmlParser();
+      String xmlString = sbmlExporter.toXml(model);
+
+      InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
+
+      Model model2 = sbmlParser.createModel(new ConverterParams().inputStream(is).sizeAutoAdjust(false));
+      model2.setName(model.getName());
+      model2.getReactions().iterator().next().setIdReaction(reactionId);
+
+      ModelComparator comparator = new ModelComparator();
+      assertEquals(0, comparator.compare(model, model2));
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+}
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporterTest.java
index 471f844b462f960b4d52d25e611d80b584f1f6e9..d29f86f82f6177fb92f5dc5d3f2212cb7edeef3e 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporterTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporterTest.java
@@ -11,9 +11,7 @@ import org.mockito.Mockito;
 import org.sbml.jsbml.Model;
 import org.sbml.jsbml.SBMLDocument;
 import org.sbml.jsbml.ext.layout.Layout;
-import org.sbml.jsbml.ext.layout.LayoutModelPlugin;
 import org.sbml.jsbml.ext.render.ColorDefinition;
-import org.sbml.jsbml.ext.render.RenderLayoutPlugin;
 
 import lcsb.mapviewer.model.map.model.ModelFullIndexed;
 
@@ -22,9 +20,8 @@ public class SbmlBioEntityExporterTest {
   @Test
   public void testEmptyGetRenderPlugin() {
     @SuppressWarnings("rawtypes")
-    SbmlBioEntityExporter exporter = Mockito.mock(SbmlBioEntityExporter.class, Mockito.CALLS_REAL_METHODS);
-    Layout layout = new Layout();
-    exporter.setLayout(layout);
+    SbmlBioEntityExporter exporter = createMockExporter();
+    Mockito.when(exporter.getLayout()).thenReturn(new Layout());
 
     assertNull(exporter.getRenderPlugin());
   }
@@ -45,8 +42,7 @@ public class SbmlBioEntityExporterTest {
     SbmlExporter sbmlExporter = new SbmlExporter();
     Layout layout = sbmlExporter.createSbmlLayout(new ModelFullIndexed(null), result);
 
-    exporter.setSbmlModel(result);
-    exporter.setLayout(layout);
+    Mockito.when(exporter.getLayout()).thenReturn(layout);
     return exporter;
   }
 
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java
index 8df5c06836ed05d709c12ab1431ce6ed3296ff94..ea123e1ed50f3cf81b536711a816e8d0b4321d85 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java
@@ -12,11 +12,18 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.lang.reflect.Modifier;
 import java.nio.file.Files;
+import java.util.Arrays;
 import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.junit.Test;
 import org.reflections.Reflections;
+import org.sbml.jsbml.SBMLDocument;
+import org.sbml.jsbml.ext.multi.MultiModelPlugin;
+import org.sbml.jsbml.ext.multi.MultiSpeciesPlugin;
+import org.sbml.jsbml.ext.multi.MultiSpeciesType;
+import org.sbml.jsbml.ext.multi.PossibleSpeciesFeatureValue;
+import org.sbml.jsbml.ext.multi.SpeciesFeatureType;
 
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.converter.ConverterParams;
@@ -38,14 +45,21 @@ import lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.map.species.GenericProtein;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.ModificationState;
+import lcsb.mapviewer.model.map.species.field.PositionToCompartment;
+import lcsb.mapviewer.model.map.species.field.Residue;
 
 public class SbmlExporterTest {
   Logger logger = Logger.getLogger(SbmlExporterTest.class);
   SbmlParser parser = new SbmlParser();
-  SbmlExporter exporter = new SbmlExporter();
+  SbmlExporter exporter;
 
   ModelComparator comparator = new ModelComparator();
 
+  public SbmlExporterTest() {
+    exporter = new SbmlExporter();
+  }
+
   @Test
   public void testExportCompartment() throws Exception {
     Model model = getModelAfterSerializing("testFiles/layoutExample/CompartmentGlyph_Example_level2_level3.xml");
@@ -185,9 +199,7 @@ public class SbmlExporterTest {
   }
 
   private Model createModelWithReaction() {
-    Model model = new ModelFullIndexed(null);
-    model.setWidth(1000);
-    model.setHeight(1000);
+    Model model = createEmptyModel();
     GenericProtein p1 = new GenericProtein("s1");
     p1.setWidth(100);
     p1.setHeight(20);
@@ -254,11 +266,7 @@ public class SbmlExporterTest {
     String tempFilename = File.createTempFile("tmp", ".xml").getAbsolutePath();
     IConverter converter = new SbmlParser();
 
-    Model model = new ModelFullIndexed(null);
-    model.setWidth(100);
-    model.setHeight(100);
-    model.setName("UNKNOWN DISEASE MAP");
-    model.setIdModel("id1");
+    Model model = createEmptyModel();
 
     converter.exportModelToFile(model, tempFilename);
 
@@ -270,6 +278,15 @@ public class SbmlExporterTest {
 
   }
 
+  private Model createEmptyModel() {
+    Model model = new ModelFullIndexed(null);
+    model.setWidth(1000);
+    model.setHeight(1000);
+    model.setName("UNKNOWN DISEASE MAP");
+    model.setIdModel("id1");
+    return model;
+  }
+
   @Test
   public void testExportProblematicNotes() throws Exception {
     Model model = createModelWithReaction();
@@ -323,11 +340,7 @@ public class SbmlExporterTest {
     Set<Class<? extends Species>> classes = reflections.getSubTypesOf(Species.class);
     for (Class<? extends Element> class1 : classes) {
       if (!Modifier.isAbstract(class1.getModifiers())) {
-        Model model = new ModelFullIndexed(null);
-        model.setIdModel("Test123");
-        model.setName("x");
-        model.setWidth("300");
-        model.setHeight("300");
+        Model model = createEmptyModel();
         Element element = class1.getConstructor(String.class).newInstance("x");
         element.setName("test name");
         element.setX(10);
@@ -343,4 +356,277 @@ public class SbmlExporterTest {
     }
   }
 
+  @Test
+  public void testSetUsedExtensions() throws Exception {
+    SbmlExporter exporter = new SbmlExporter();
+    exporter.removeSbmlExtensions(Arrays.asList(SbmlExtension.values()));
+    exporter.addSbmlExtension(SbmlExtension.LAYOUT);
+
+    assertEquals(1, exporter.getSbmlExtensions().size());
+    assertEquals(SbmlExtension.LAYOUT, exporter.getSbmlExtensions().iterator().next());
+
+    exporter.removeSbmlExtension(SbmlExtension.LAYOUT);
+    assertEquals(0, exporter.getSbmlExtensions().size());
+  }
+
+  @Test
+  public void testExportWithLayoutExtension() throws Exception {
+    SbmlExporter exporter = new SbmlExporter();
+    exporter.removeSbmlExtensions(Arrays.asList(SbmlExtension.values()));
+    exporter.addSbmlExtension(SbmlExtension.LAYOUT);
+
+    Model model = createModelWithReaction();
+    String xml = exporter.toXml(model);
+
+    assertTrue(xml.contains("layout:listOfLayouts"));
+  }
+
+  @Test
+  public void testExportWithoutLayoutExtension() throws Exception {
+    SbmlExporter exporter = new SbmlExporter();
+    exporter.removeSbmlExtensions(Arrays.asList(SbmlExtension.values()));
+
+    Model model = createModelWithReaction();
+    String xml = exporter.toXml(model);
+
+    assertFalse(xml.contains("layout:listOfLayouts"));
+  }
+
+  @Test
+  public void testExportWithRenderExtension() throws Exception {
+    SbmlExporter exporter = new SbmlExporter();
+    exporter.removeSbmlExtensions(Arrays.asList(SbmlExtension.values()));
+    exporter.addSbmlExtension(SbmlExtension.LAYOUT);
+    exporter.addSbmlExtension(SbmlExtension.RENDER);
+
+    Model model = createModelWithReaction();
+    String xml = exporter.toXml(model);
+
+    assertTrue(xml.contains("render:listOfRenderInformation"));
+  }
+
+  @Test
+  public void testExportWithoutRenderExtension() throws Exception {
+    SbmlExporter exporter = new SbmlExporter();
+    exporter.removeSbmlExtensions(Arrays.asList(SbmlExtension.values()));
+    exporter.addSbmlExtension(SbmlExtension.LAYOUT);
+
+    Model model = createModelWithReaction();
+    String xml = exporter.toXml(model);
+
+    assertFalse(xml.contains("render:listOfRenderInformation"));
+  }
+
+  @Test
+  public void testExportWithoutMultiExtensionSupportSpeciesTypes() throws Exception {
+    SbmlExporter exporter = new SbmlExporter();
+    exporter.removeSbmlExtensions(Arrays.asList(SbmlExtension.values()));
+    exporter.addSbmlExtension(SbmlExtension.MULTI);
+
+    org.sbml.jsbml.Model sbmlModel = exporter.toSbmlDocument(createModelWithReaction()).getModel();
+    MultiModelPlugin multiPlugin = (MultiModelPlugin) sbmlModel.getExtension("multi");
+    assertNotNull("Multi plugin is not present in sbml model", multiPlugin);
+
+    assertTrue("Species types are not exported", multiPlugin.getListOfSpeciesTypes().size() > 0);
+  }
+
+  @Test
+  public void testMultiExtensionSBOTermsForTypes() throws Exception {
+    SbmlExporter exporter = new SbmlExporter();
+    SBMLDocument doc = new SBMLDocument(3, 2);
+    org.sbml.jsbml.Model result = doc.createModel("id");
+    MultiModelPlugin multiPlugin = exporter.createSbmlMultiPlugin(result);
+
+    for (MultiSpeciesType speciesType : multiPlugin.getListOfSpeciesTypes()) {
+      assertNotNull("SBO term not defined for type " + speciesType.getName(), speciesType.getSBOTermID());
+      assertFalse("SBO term not defined for type " + speciesType.getName(), speciesType.getSBOTermID().isEmpty());
+    }
+
+  }
+
+  @Test
+  public void testExportProteinState() throws Exception {
+    Model model = createEmptyModel();
+    GenericProtein element = createProtein();
+    element.setStructuralState("xxx");
+    model.addElement(element);
+    Model deserializedModel = getModelAfterSerializing(model);
+
+    assertEquals("Structural state not exported/imported properly", 0, comparator.compare(model, deserializedModel));
+  }
+
+  @Test
+  public void testExportPositionToCompartment() throws Exception {
+    Model model = createEmptyModel();
+    GenericProtein element = createProtein();
+    element.setPositionToCompartment(PositionToCompartment.INSIDE);
+    model.addElement(element);
+    Model deserializedModel = getModelAfterSerializing(model);
+
+    assertEquals("Postion to compartment not exported/imported properly", 0,
+        comparator.compare(model, deserializedModel));
+  }
+
+  @Test
+  public void testExportOuterSurfacePositionToCompartment() throws Exception {
+    Model model = createEmptyModel();
+    GenericProtein element = createProtein();
+    element.setPositionToCompartment(PositionToCompartment.OUTER_SURFACE);
+    model.addElement(element);
+    Model deserializedModel = getModelAfterSerializing(model);
+
+    assertEquals("Postion to compartment not exported/imported properly", 0,
+        comparator.compare(model, deserializedModel));
+  }
+
+  @Test
+  public void testMultiExtensionProteinStateInTypes() throws Exception {
+    String structuralState = "xxx";
+    Model model = createEmptyModel();
+    GenericProtein element = new GenericProtein("id");
+    element.setName("test name");
+    element.setX(10);
+    element.setWidth(10);
+    element.setY(10);
+    element.setHeight(10);
+    element.setStructuralState(structuralState);
+    model.addElement(element);
+    org.sbml.jsbml.Model sbmlModel = exporter.toSbmlDocument(model).getModel();
+    MultiModelPlugin multiPlugin = (MultiModelPlugin) sbmlModel.getExtension("multi");
+
+    boolean structuralStateValueFound = false;
+    for (MultiSpeciesType speciesType : multiPlugin.getListOfSpeciesTypes()) {
+      for (SpeciesFeatureType featureType : speciesType.getListOfSpeciesFeatureTypes()) {
+        for (PossibleSpeciesFeatureValue featureValue : featureType.getListOfPossibleSpeciesFeatureValues()) {
+          if (featureValue.getName().equals(structuralState)) {
+            structuralStateValueFound = true;
+          }
+        }
+      }
+    }
+    assertTrue("Structural state not defined in the list of possible values", structuralStateValueFound);
+
+  }
+
+  @Test
+  public void testMultiExtensionProteinStateSuplicateInTypes() throws Exception {
+    String structuralState = "xxx";
+    Model model = createEmptyModel();
+    GenericProtein element = new GenericProtein("id");
+    element.setName("test name");
+    element.setX(10);
+    element.setWidth(10);
+    element.setY(10);
+    element.setHeight(10);
+    element.setStructuralState(structuralState);
+    model.addElement(element);
+    element = new GenericProtein("id2");
+    element.setName("test name");
+    element.setX(10);
+    element.setWidth(10);
+    element.setY(10);
+    element.setHeight(10);
+    element.setStructuralState(structuralState);
+    model.addElement(element);
+    org.sbml.jsbml.Model sbmlModel = exporter.toSbmlDocument(model).getModel();
+    MultiModelPlugin multiPlugin = (MultiModelPlugin) sbmlModel.getExtension("multi");
+
+    for (MultiSpeciesType speciesType : multiPlugin.getListOfSpeciesTypes()) {
+      for (SpeciesFeatureType featureType : speciesType.getListOfSpeciesFeatureTypes()) {
+        assertTrue(featureType.getListOfPossibleSpeciesFeatureValues().size() <= 2);
+      }
+    }
+  }
+
+  @Test
+  public void testMultiExtensionTypeDefinition() throws Exception {
+    Model model = createEmptyModel();
+    GenericProtein element = createProtein();
+    model.addElement(element);
+    org.sbml.jsbml.Model sbmlModel = exporter.toSbmlDocument(model).getModel();
+
+    MultiModelPlugin multiPlugin = (MultiModelPlugin) sbmlModel.getExtension("multi");
+
+    org.sbml.jsbml.Species sbmlSpecies = sbmlModel.getSpecies(0);
+    MultiSpeciesPlugin speciesExtension = (MultiSpeciesPlugin) sbmlSpecies.getExtension("multi");
+    assertNotNull("Multi extension not defined for species", speciesExtension);
+    String speciesTypeString = speciesExtension.getSpeciesType();
+
+    MultiSpeciesType speciesType = null;
+    for (MultiSpeciesType type : multiPlugin.getListOfSpeciesTypes()) {
+      if (type.getId().equals(speciesTypeString)) {
+        speciesType = type;
+      }
+    }
+    assertNotNull("Species type is not set in multi extension", speciesType);
+
+  }
+
+  @Test
+  public void testMultiExtensionStructuralStateTypeDefinition() throws Exception {
+    String structuralState = "xxx";
+    Model model = createEmptyModel();
+    GenericProtein element = new GenericProtein("id");
+    element.setName("test name");
+    element.setX(10);
+    element.setWidth(10);
+    element.setY(10);
+    element.setHeight(10);
+    element.setStructuralState(structuralState);
+    model.addElement(element);
+    org.sbml.jsbml.Model sbmlModel = exporter.toSbmlDocument(model).getModel();
+
+    org.sbml.jsbml.Species sbmlSpecies = sbmlModel.getSpecies(0);
+    MultiSpeciesPlugin speciesExtension = (MultiSpeciesPlugin) sbmlSpecies.getExtension("multi");
+    assertNotNull("Multi extension not defined for species", speciesExtension);
+    assertTrue("structural state feature not defined in multi extension",
+        speciesExtension.getListOfSpeciesFeatures().size() > 0);
+  }
+
+  @Test
+  public void testExportResidue() throws Exception {
+    Model model = createEmptyModel();
+    GenericProtein element = createProtein();
+    Residue mr = new Residue("x1");
+    mr.setName("217U");
+    mr.setState(ModificationState.PHOSPHORYLATED);
+    mr.setPosition(new Point2D.Double(10, 11));
+    element.addResidue(mr);
+    mr = new Residue("Y");
+    mr.setName("218");
+    mr.setState(ModificationState.PHOSPHORYLATED);
+    mr.setPosition(new Point2D.Double(10, 12));
+    element.addResidue(mr);
+    mr = new Residue("Z");
+    mr.setName("219");
+    mr.setState(ModificationState.UBIQUITINATED);
+    mr.setPosition(new Point2D.Double(10, 13));
+    element.addResidue(mr);
+    model.addElement(element);
+    Model deserializedModel = getModelAfterSerializing(model);
+
+    GenericProtein protein = deserializedModel.getElementByElementId("id");
+    assertEquals("Residues weren't exported/imported properly", 3, protein.getModificationResidues().size());
+
+  }
+
+  private GenericProtein createProtein() {
+    GenericProtein element = new GenericProtein("id");
+    element.setName("test name");
+    element.setX(10);
+    element.setWidth(10);
+    element.setY(10);
+    element.setHeight(10);
+    return element;
+  }
+
+  @Test
+  public void testExportNotes() throws Exception {
+    Model model = createEmptyModel();
+    model.setNotes("XX");
+    Model deserializedModel = getModelAfterSerializing(model);
+
+    assertEquals("Notes weren't exported/imported properly", model.getNotes(), deserializedModel.getNotes());
+
+  }
 }
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java
index 4147026343771ef17946d4214ed9e17562d8f41b..33e1e82180d1777a8f71cc578651bac70f110e69 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java
@@ -7,23 +7,48 @@ import static org.junit.Assert.assertTrue;
 
 import java.awt.Color;
 import java.io.FileNotFoundException;
+import java.util.List;
 
 import org.apache.log4j.Logger;
+import org.apache.log4j.spi.LoggingEvent;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 import lcsb.mapviewer.common.Configuration;
+import lcsb.mapviewer.common.EventStorageLoggerAppender;
 import lcsb.mapviewer.converter.ConverterParams;
 import lcsb.mapviewer.converter.InvalidInputDataExecption;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.reaction.Reaction;
 import lcsb.mapviewer.model.map.reaction.ReactionNode;
+import lcsb.mapviewer.model.map.species.Gene;
+import lcsb.mapviewer.model.map.species.GenericProtein;
 import lcsb.mapviewer.model.map.species.Species;
 
 public class SbmlParserTest {
   Logger logger = Logger.getLogger(SbmlParserTest.class);
   SbmlParser parser = new SbmlParser();
 
+  private EventStorageLoggerAppender appender;
+
+  @Before
+  public final void _setUp() throws Exception {
+    Logger.getRootLogger().removeAppender(appender);
+    appender = new EventStorageLoggerAppender();
+    Logger.getRootLogger().addAppender(appender);
+  }
+
+  @After
+  public final void _tearDown() throws Exception {
+    Logger.getRootLogger().removeAppender(appender);
+  }
+
+  protected List<LoggingEvent> getWarnings() {
+    return appender.getWarnings();
+  }
+
   @Test
   public void testParseCompartment() throws FileNotFoundException, InvalidInputDataExecption {
     Model model = parser.createModel(
@@ -191,4 +216,17 @@ public class SbmlParserTest {
     assertTrue(model.getHeight() > 0);
   }
 
+  @Test
+  public void testParseTypeFromMulti() throws Exception {
+    Model model = parser.createModel(new ConverterParams().filename("testFiles/multi_features/species_type.xml"));
+    assertTrue(model.getElementByElementId("species_0") instanceof Gene);
+  }
+
+  @Test
+  public void testParseConflictingTypesFromMulti() throws Exception {
+    Model model = parser.createModel(new ConverterParams().filename("testFiles/multi_features/conflicting_species_type.xml"));
+    assertTrue(model.getElementByElementId("species_0") instanceof GenericProtein);
+    assertEquals(1, getWarnings().size());
+  }
+
 }
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporterTest.java
index b41612ed3ec30e12d23dbfba3fb338e177e67970..ce2936868e767e422bff66032df674c1f458dda0 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporterTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporterTest.java
@@ -2,6 +2,8 @@ package lcsb.mapviewer.converter.model.sbml.reaction;
 
 import static org.junit.Assert.assertNotNull;
 
+import java.util.Arrays;
+
 import org.junit.Test;
 import org.sbml.jsbml.Model;
 import org.sbml.jsbml.SBMLDocument;
@@ -10,6 +12,7 @@ import org.sbml.jsbml.ext.layout.Layout;
 import org.sbml.jsbml.ext.layout.LayoutModelPlugin;
 
 import lcsb.mapviewer.converter.model.sbml.SbmlBioEntityExporter;
+import lcsb.mapviewer.converter.model.sbml.SbmlExtension;
 import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentExporter;
 import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesExporter;
 import lcsb.mapviewer.model.map.InconsistentModelException;
@@ -69,12 +72,14 @@ public class SbmlReactionExporterTest {
     plugin.add(layout);
     result.addExtension("layout", plugin);
 
-    SbmlCompartmentExporter compartmentExporter = new SbmlCompartmentExporter(layout, model);
-    SbmlBioEntityExporter<Species, org.sbml.jsbml.Species> speciesExporter = new SbmlSpeciesExporter(layout, model,
+    SbmlCompartmentExporter compartmentExporter = new SbmlCompartmentExporter(result, model,
+        Arrays.asList(SbmlExtension.values()));
+    SbmlBioEntityExporter<Species, org.sbml.jsbml.Species> speciesExporter = new SbmlSpeciesExporter(result, model,
+        Arrays.asList(SbmlExtension.values()),
         compartmentExporter);
 
-    SbmlReactionExporter exporter = new SbmlReactionExporter(layout, model, speciesExporter, compartmentExporter);
-    exporter.setSbmlModel(result);
+    SbmlReactionExporter exporter = new SbmlReactionExporter(result, model, speciesExporter,
+        Arrays.asList(SbmlExtension.values()), compartmentExporter);
     return exporter;
   }
 
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java
index 0a5a2db97f858a34d10b2be982b7b44ab6efd84b..918231660e7b3cb5c78cf36877f51fcd868263cc 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java
@@ -1,13 +1,17 @@
 package lcsb.mapviewer.converter.model.sbml.species;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.Arrays;
+import java.util.Collection;
 
 import org.apache.log4j.Logger;
 import org.junit.Test;
 import org.sbml.jsbml.SBMLDocument;
-import org.sbml.jsbml.ext.layout.Layout;
 
 import lcsb.mapviewer.converter.model.sbml.SbmlExporter;
+import lcsb.mapviewer.converter.model.sbml.SbmlExtension;
 import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentExporter;
 import lcsb.mapviewer.model.map.InconsistentModelException;
 import lcsb.mapviewer.model.map.compartment.Compartment;
@@ -15,15 +19,14 @@ import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.model.ModelFullIndexed;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.map.species.GenericProtein;
+import lcsb.mapviewer.model.map.species.Protein;
+import lcsb.mapviewer.model.map.species.Species;
 
 public class SbmlSpeciesExporterTest {
 
   Logger logger = Logger.getLogger(SbmlSpeciesExporterTest.class);
 
-  SbmlCompartmentExporter compartmentExporter;
-
   org.sbml.jsbml.Model sbmlModel;
-  Layout sbmlLayout;
 
   @Test
   public void testOneElementWithTwoAliases() throws InconsistentModelException {
@@ -37,7 +40,7 @@ public class SbmlSpeciesExporterTest {
 
     SbmlSpeciesExporter exporter = createExporter(model);
 
-    exporter.exportElements(sbmlModel);
+    exporter.exportElements();
 
     assertEquals(1, sbmlModel.getSpeciesCount());
   }
@@ -59,22 +62,45 @@ public class SbmlSpeciesExporterTest {
 
     SbmlSpeciesExporter exporter = createExporter(model);
 
-    exporter.exportElements(sbmlModel);
+    exporter.exportElements();
 
     assertEquals(2, sbmlModel.getSpeciesCount());
   }
 
   private SbmlSpeciesExporter createExporter(Model model) throws InconsistentModelException {
+    return createExporter(model, Arrays.asList(new SbmlExtension[] { SbmlExtension.RENDER, SbmlExtension.LAYOUT }));
+  }
+
+  private SbmlSpeciesExporter createExporter(Model model, Collection<SbmlExtension> sbmlExtensions)
+      throws InconsistentModelException {
     SBMLDocument doc = new SBMLDocument(3, 1);
     sbmlModel = doc.createModel(model.getIdModel());
 
     SbmlExporter sbmlExporter = new SbmlExporter();
-    sbmlLayout = sbmlExporter.createSbmlLayout(model, sbmlModel);
+    sbmlExporter.createSbmlLayout(model, sbmlModel);
 
-    SbmlCompartmentExporter compartmentExporter = new SbmlCompartmentExporter(sbmlLayout, model);
-    compartmentExporter.exportElements(sbmlModel);
-    SbmlSpeciesExporter result = new SbmlSpeciesExporter(sbmlLayout, model, compartmentExporter);
+    SbmlCompartmentExporter compartmentExporter = new SbmlCompartmentExporter(sbmlModel, model,
+        Arrays.asList(SbmlExtension.values()));
+    compartmentExporter.exportElements();
+
+    SbmlSpeciesExporter result = new SbmlSpeciesExporter(sbmlModel, model, sbmlExtensions, compartmentExporter);
     return result;
   }
 
+  @Test
+  public void testIdsOfSpeciesWithStructuralStates() throws InconsistentModelException {
+    Species protein1 = new GenericProtein("sa1");
+    protein1.setName("SNCA");
+    Protein protein2 = new GenericProtein("sa2");
+    protein2.setName("SNCA");
+    protein2.setStructuralState("X");
+    Model model = new ModelFullIndexed(null);
+    model.addElement(protein1);
+    model.addElement(protein2);
+
+    SbmlSpeciesExporter exporter = createExporter(model, Arrays.asList(SbmlExtension.values()));
+
+    assertFalse(exporter.getSbmlIdKey(protein1).equals(exporter.getSbmlIdKey(protein2)));
+  }
+
 }
diff --git a/converter-sbml/testFiles/cd_for_multi/coding_sites.xml b/converter-sbml/testFiles/cd_for_multi/coding_sites.xml
new file mode 100644
index 0000000000000000000000000000000000000000..57f7b2d65b2fad09579b3c4c4e32047da831f4d5
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/coding_sites.xml
@@ -0,0 +1,158 @@
+<?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:listOfComplexSpeciesAliases/>
+<celldesigner:listOfSpeciesAliases>
+<celldesigner:speciesAlias id="sa2" species="s2">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="126.0" y="143.5" w="70.0" h="25.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="70.0" height="25.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffffff66" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa3" species="s3">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="208.0" y="141.5" w="70.0" h="25.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="70.0" height="25.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffffff66" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa4" species="s4">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="125.0" y="179.5" w="70.0" h="25.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="70.0" height="25.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffffff66" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins/>
+<celldesigner:listOfGenes>
+<celldesigner:gene id="gn1" name="s2" type="GENE">
+<celldesigner:listOfRegions>
+<celldesigner:region id="tr1" name="x" size="0.0" pos="0.3" type="Modification Site" active="false"/>
+<celldesigner:region id="tr2" name="s" size="0.1" pos="0.44" type="transcriptionStartingSiteL" active="false"/>
+<celldesigner:region id="tr3" name="e" size="0.1" pos="0.71" type="transcriptionStartingSiteR" active="true"/>
+</celldesigner:listOfRegions>
+</celldesigner:gene>
+<celldesigner:gene id="gn2" name="s4" type="GENE"/>
+</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"/>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s2" id="s2" name="s2" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>GENE</celldesigner:class>
+<celldesigner:geneReference>gn1</celldesigner:geneReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s3" id="s3" name="s2" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>GENE</celldesigner:class>
+<celldesigner:geneReference>gn1</celldesigner:geneReference>
+<celldesigner:state>
+<celldesigner:listOfModifications>
+<celldesigner:modification residue="tr1" state="phosphorylated"/>
+</celldesigner:listOfModifications>
+</celldesigner:state>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s4" id="s4" name="s4" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>GENE</celldesigner:class>
+<celldesigner:geneReference>gn2</celldesigner:geneReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/cd_for_multi/complex.xml b/converter-sbml/testFiles/cd_for_multi/complex.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4fc51912298510cfeb27ca7fe505eb86a1d36d0a
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/complex.xml
@@ -0,0 +1,338 @@
+<?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:listOfIncludedSpecies>
+<celldesigner:species id="s2" name="s2">
+<celldesigner:notes>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title/>
+</head>
+<body/>
+</html>
+</celldesigner:notes>
+<celldesigner:annotation>
+<celldesigner:complexSpecies>s1</celldesigner:complexSpecies>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:annotation>
+</celldesigner:species>
+<celldesigner:species id="s3" name="s3">
+<celldesigner:notes>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title/>
+</head>
+<body/>
+</html>
+</celldesigner:notes>
+<celldesigner:annotation>
+<celldesigner:complexSpecies>s1</celldesigner:complexSpecies>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr2</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:annotation>
+</celldesigner:species>
+<celldesigner:species id="s6" name="s2">
+<celldesigner:notes>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title/>
+</head>
+<body/>
+</html>
+</celldesigner:notes>
+<celldesigner:annotation>
+<celldesigner:complexSpecies>s4</celldesigner:complexSpecies>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:annotation>
+</celldesigner:species>
+<celldesigner:species id="s8" name="s8">
+<celldesigner:notes>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title/>
+</head>
+<body/>
+</html>
+</celldesigner:notes>
+<celldesigner:annotation>
+<celldesigner:complexSpecies>s7</celldesigner:complexSpecies>
+<celldesigner:speciesIdentity>
+<celldesigner:class>COMPLEX</celldesigner:class>
+<celldesigner:name>s8</celldesigner:name>
+</celldesigner:speciesIdentity>
+</celldesigner:annotation>
+</celldesigner:species>
+<celldesigner:species id="s9" name="s2">
+<celldesigner:notes>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title/>
+</head>
+<body/>
+</html>
+</celldesigner:notes>
+<celldesigner:annotation>
+<celldesigner:complexSpecies>s8</celldesigner:complexSpecies>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:annotation>
+</celldesigner:species>
+</celldesigner:listOfIncludedSpecies>
+<celldesigner:listOfCompartmentAliases/>
+<celldesigner:listOfComplexSpeciesAliases>
+<celldesigner:complexSpeciesAlias id="csa1" species="s1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="37.0" y="40.0" w="100.0" h="120.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:backupSize w="0.0" h="0.0"/>
+<celldesigner:backupView state="none"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="100.0" height="120.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:complexSpeciesAlias>
+<celldesigner:complexSpeciesAlias id="csa2" species="s4">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="151.0" y="39.0" w="100.0" h="120.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:backupSize w="0.0" h="0.0"/>
+<celldesigner:backupView state="none"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="100.0" height="120.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:complexSpeciesAlias>
+<celldesigner:complexSpeciesAlias id="csa3" species="s7">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="265.0" y="38.0" w="150.0" h="166.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:backupSize w="0.0" h="0.0"/>
+<celldesigner:backupView state="none"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="150.0" height="166.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:complexSpeciesAlias>
+<celldesigner:complexSpeciesAlias id="csa4" species="s8" complexSpeciesAlias="csa3">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="270.0" y="52.0" w="140.0" h="123.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:backupSize w="0.0" h="0.0"/>
+<celldesigner:backupView state="none"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="5.0" y="14.0"/>
+<celldesigner:boxSize width="140.0" height="123.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:complexSpeciesAlias>
+</celldesigner:listOfComplexSpeciesAliases>
+<celldesigner:listOfSpeciesAliases>
+<celldesigner:speciesAlias id="sa1" species="s2" complexSpeciesAlias="csa1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="39.0" y="51.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="2.0" y="11.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa2" species="s3" complexSpeciesAlias="csa1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="39.0" y="102.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="2.0" y="62.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa4" species="s6" complexSpeciesAlias="csa2">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="159.0" y="53.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="8.0" y="14.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa5" species="s9" complexSpeciesAlias="csa4">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="297.0" y="56.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="27.0" y="4.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins>
+<celldesigner:protein id="pr1" name="s2" type="GENERIC"/>
+<celldesigner:protein id="pr2" name="s3" type="GENERIC"/>
+</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"/>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s1" id="s1" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>COMPLEX</celldesigner:class>
+<celldesigner:name>s1</celldesigner:name>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s4" id="s4" name="s4" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>COMPLEX</celldesigner:class>
+<celldesigner:name>s4</celldesigner:name>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s7" id="s7" name="s7" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>COMPLEX</celldesigner:class>
+<celldesigner:name>s7</celldesigner:name>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/cd_for_multi/different_complex_with_the_same_name.xml b/converter-sbml/testFiles/cd_for_multi/different_complex_with_the_same_name.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f2ea7d3f6de9efcfded42954ad2efd19a7a113dc
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/different_complex_with_the_same_name.xml
@@ -0,0 +1,168 @@
+<?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:listOfIncludedSpecies>
+<celldesigner:species id="s4" name="s3">
+<celldesigner:notes>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title/>
+</head>
+<body/>
+</html>
+</celldesigner:notes>
+<celldesigner:annotation>
+<celldesigner:complexSpecies>s3</celldesigner:complexSpecies>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:annotation>
+</celldesigner:species>
+</celldesigner:listOfIncludedSpecies>
+<celldesigner:listOfCompartmentAliases/>
+<celldesigner:listOfComplexSpeciesAliases>
+<celldesigner:complexSpeciesAlias id="csa1" species="s1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="130.0" y="102.0" w="100.0" h="120.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:backupSize w="0.0" h="0.0"/>
+<celldesigner:backupView state="none"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="100.0" height="120.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:complexSpeciesAlias>
+<celldesigner:complexSpeciesAlias id="csa2" species="s3">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="252.0" y="102.0" w="100.0" h="120.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:backupSize w="0.0" h="0.0"/>
+<celldesigner:backupView state="none"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="100.0" height="120.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="2.0"/>
+<celldesigner:paint color="fff7f7f7" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:complexSpeciesAlias>
+</celldesigner:listOfComplexSpeciesAliases>
+<celldesigner:listOfSpeciesAliases>
+<celldesigner:speciesAlias id="sa1" species="s4" complexSpeciesAlias="csa2">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="263.0" y="124.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="11.0" y="22.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins>
+<celldesigner:protein id="pr1" name="s3" type="GENERIC"/>
+</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"/>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s1" id="s1" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>COMPLEX</celldesigner:class>
+<celldesigner:name>s1</celldesigner:name>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s3" id="s3" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>COMPLEX</celldesigner:class>
+<celldesigner:name>s1</celldesigner:name>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/" xmlns:bqmodel="http://biomodels.net/model-qualifiers/">
+<rdf:Description rdf:about="#s3">
+<bqmodel:is>
+<rdf:Bag>
+<rdf:li rdf:resource="urn:miriam:pubmed:12345"/>
+</rdf:Bag>
+</bqmodel:is>
+</rdf:Description>
+</rdf:RDF>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/cd_for_multi/modification_in_aliases.xml b/converter-sbml/testFiles/cd_for_multi/modification_in_aliases.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b2b1a3cf818f757d303ff5a8cc105aa81276c50a
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/modification_in_aliases.xml
@@ -0,0 +1,109 @@
+<?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:listOfComplexSpeciesAliases/>
+<celldesigner:listOfSpeciesAliases>
+<celldesigner:speciesAlias id="sa1" species="s1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="120.0" y="168.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa3" species="s1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="267.0" y="165.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins>
+<celldesigner:protein id="pr1" name="s1" type="GENERIC">
+<celldesigner:listOfModificationResidues>
+<celldesigner:modificationResidue angle="3.141592653589793" id="rs1" side="none"/>
+</celldesigner:listOfModificationResidues>
+</celldesigner:protein>
+</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"/>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s1" id="s1" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/cd_for_multi/modification_residues.xml b/converter-sbml/testFiles/cd_for_multi/modification_residues.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7006cd331452667353d54a59a1cd2eb3810f58fb
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/modification_residues.xml
@@ -0,0 +1,232 @@
+<?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:listOfComplexSpeciesAliases/>
+<celldesigner:listOfSpeciesAliases>
+<celldesigner:speciesAlias id="sa1" species="s4">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="86.0" y="81.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa2" species="s2">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="193.0" y="79.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa3" species="s1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="194.0" y="151.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa4" species="s5">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="88.0" y="152.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa5" species="s3">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="287.0" y="79.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins>
+<celldesigner:protein id="pr1" name="s1" type="GENERIC">
+<celldesigner:listOfModificationResidues>
+<celldesigner:modificationResidue angle="3.14" id="rs1" name="n2" side="none"/>
+<celldesigner:modificationResidue angle="1.64" id="rs2" name="n1" side="none"/>
+</celldesigner:listOfModificationResidues>
+</celldesigner:protein>
+<celldesigner:protein id="pr3" name="s3" type="GENERIC"/>
+<celldesigner:protein id="pr2" name="s2" type="GENERIC">
+<celldesigner:listOfModificationResidues>
+<celldesigner:modificationResidue angle="3.141592653589793" id="rs1" name="x" side="none"/>
+</celldesigner:listOfModificationResidues>
+</celldesigner:protein>
+</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"/>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s1" id="s1" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s3" id="s3" name="s3" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr3</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s4" id="s4" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+<celldesigner:state>
+<celldesigner:listOfModifications>
+<celldesigner:modification residue="rs2" state="phosphorylated"/>
+</celldesigner:listOfModifications>
+</celldesigner:state>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s2" id="s2" name="s2" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr2</celldesigner:proteinReference>
+<celldesigner:state>
+<celldesigner:listOfModifications>
+<celldesigner:modification residue="rs1" state="acetylated"/>
+</celldesigner:listOfModifications>
+</celldesigner:state>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s5" id="s5" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+<celldesigner:state>
+<celldesigner:listOfModifications>
+<celldesigner:modification residue="rs1" state="ubiquitinated"/>
+</celldesigner:listOfModifications>
+</celldesigner:state>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/cd_for_multi/position_to_compartment_in_aliases.xml b/converter-sbml/testFiles/cd_for_multi/position_to_compartment_in_aliases.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0b2a4d4298eb1358c5ce3c1ff91cf2d50167adf9
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/position_to_compartment_in_aliases.xml
@@ -0,0 +1,132 @@
+<?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="132.0" y="88.0" w="263.0" h="142.0"/>
+<celldesigner:namePoint x="142.0" y="98.0"/>
+<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:speciesAlias id="sa1" species="s3" compartmentAlias="ca1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="85.0" y="133.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="-47.0" y="45.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa3" species="s1" compartmentAlias="ca1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="232.0" y="130.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="100.0" y="42.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins>
+<celldesigner:protein id="pr1" name="s1" type="GENERIC"/>
+</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">
+<annotation>
+<celldesigner:extension>
+<celldesigner:name>c1</celldesigner:name>
+</celldesigner:extension>
+</annotation>
+</compartment>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s1" id="s1" name="s1" compartment="c1" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s3" id="s3" name="s1" compartment="c1" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>transmembrane</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/cd_for_multi/protein_in_active_and_inactive_state.xml b/converter-sbml/testFiles/cd_for_multi/protein_in_active_and_inactive_state.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c828478fe70e2d959dc824018bf8f2aeb9d789cd
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/protein_in_active_and_inactive_state.xml
@@ -0,0 +1,104 @@
+<?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:listOfComplexSpeciesAliases/>
+<celldesigner:listOfSpeciesAliases>
+<celldesigner:speciesAlias id="sa2" species="s5">
+<celldesigner:activity>active</celldesigner:activity>
+<celldesigner:bounds x="91.0" y="172.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa3" species="s5">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="190.0" y="170.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins>
+<celldesigner:protein id="pr2" name="s5" type="GENERIC"/>
+</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"/>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s5" id="s5" name="s5" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr2</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/cd_for_multi/species_with_different_dimer.xml b/converter-sbml/testFiles/cd_for_multi/species_with_different_dimer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b6009c96bdc6eeb967d6f842339c6411b375258a
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/species_with_different_dimer.xml
@@ -0,0 +1,118 @@
+<?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:listOfComplexSpeciesAliases/>
+<celldesigner:listOfSpeciesAliases>
+<celldesigner:speciesAlias id="sa1" species="s2">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="127.0" y="100.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa2" species="s1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="233.0" y="101.0" w="86.0" h="46.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="86.0" height="46.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins>
+<celldesigner:protein id="pr1" name="s1" type="GENERIC"/>
+</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"/>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s1" id="s1" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+<celldesigner:state>
+<celldesigner:homodimer>2</celldesigner:homodimer>
+</celldesigner:state>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s2" id="s2" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/cd_for_multi/structural_state.xml b/converter-sbml/testFiles/cd_for_multi/structural_state.xml
new file mode 100644
index 0000000000000000000000000000000000000000..17e43d7d09606fae437b28cba78f162d00c6d76c
--- /dev/null
+++ b/converter-sbml/testFiles/cd_for_multi/structural_state.xml
@@ -0,0 +1,195 @@
+<?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:listOfComplexSpeciesAliases/>
+<celldesigner:listOfSpeciesAliases>
+<celldesigner:speciesAlias id="sa1" species="s1">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="109.0" y="53.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa2" species="s3">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="108.0" y="113.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:structuralState angle="1.5707963267948966"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa3" species="s2">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="203.0" y="53.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:structuralState angle="1.5707963267948966"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+<celldesigner:speciesAlias id="sa4" species="s4">
+<celldesigner:activity>inactive</celldesigner:activity>
+<celldesigner:bounds x="202.0" y="112.0" w="80.0" h="40.0"/>
+<celldesigner:font size="12"/>
+<celldesigner:view state="usual"/>
+<celldesigner:structuralState angle="1.5707963267948966"/>
+<celldesigner:usualView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="40.0"/>
+<celldesigner:singleLine width="1.0"/>
+<celldesigner:paint color="ffccffcc" scheme="Color"/>
+</celldesigner:usualView>
+<celldesigner:briefView>
+<celldesigner:innerPosition x="0.0" y="0.0"/>
+<celldesigner:boxSize width="80.0" height="60.0"/>
+<celldesigner:singleLine width="0.0"/>
+<celldesigner:paint color="3fff0000" scheme="Color"/>
+</celldesigner:briefView>
+<celldesigner:info state="empty" angle="-1.5707963267948966"/>
+</celldesigner:speciesAlias>
+</celldesigner:listOfSpeciesAliases>
+<celldesigner:listOfGroups/>
+<celldesigner:listOfProteins>
+<celldesigner:protein id="pr1" name="s1" type="GENERIC"/>
+<celldesigner:protein id="pr2" name="s4" type="GENERIC"/>
+</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"/>
+</listOfCompartments>
+<listOfSpecies>
+<species metaid="s2" id="s2" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+<celldesigner:state>
+<celldesigner:listOfStructuralStates>
+<celldesigner:structuralState structuralState="xyz"/>
+</celldesigner:listOfStructuralStates>
+</celldesigner:state>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s1" id="s1" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s3" id="s3" name="s1" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr1</celldesigner:proteinReference>
+<celldesigner:state>
+<celldesigner:listOfStructuralStates>
+<celldesigner:structuralState structuralState="open"/>
+</celldesigner:listOfStructuralStates>
+</celldesigner:state>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+<species metaid="s4" id="s4" name="s4" compartment="default" initialAmount="0">
+<annotation>
+<celldesigner:extension>
+<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment>
+<celldesigner:speciesIdentity>
+<celldesigner:class>PROTEIN</celldesigner:class>
+<celldesigner:proteinReference>pr2</celldesigner:proteinReference>
+<celldesigner:state>
+<celldesigner:listOfStructuralStates>
+<celldesigner:structuralState structuralState="xxx"/>
+</celldesigner:listOfStructuralStates>
+</celldesigner:state>
+</celldesigner:speciesIdentity>
+</celldesigner:extension>
+</annotation>
+</species>
+</listOfSpecies>
+</model>
+</sbml>
diff --git a/converter-sbml/testFiles/multi/bionetgen.xml.jsbml-issue b/converter-sbml/testFiles/multi/bionetgen.xml.jsbml-issue
new file mode 100644
index 0000000000000000000000000000000000000000..b9cbb493c8d59c07532f83a08efc91a747edc3c8
--- /dev/null
+++ b/converter-sbml/testFiles/multi/bionetgen.xml.jsbml-issue
@@ -0,0 +1,756 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core"
+	level="3" version="1"
+	xmlns:multi="http://www.sbml.org/sbml/level3/version1/multi/version1"
+	multi:required="true">
+	<model name="bionetgen_example_egfr_simple">
+		<listOfUnitDefinitions>
+			<unitDefinition id="molecules_per_mol">
+				<listOfUnits>
+					<unit kind="mole" scale="0" mulitplier="1" exponent="-1" />
+				</listOfUnits>
+			</unitDefinition>
+		</listOfUnitDefinitions>
+		<!-- compartments -->
+		<listOfCompartments>
+			<compartment id="Vo" constant="true"
+				spatialDimensions="3" units="liter" multi:isType="false" />
+			<compartment id="V" constant="true" spatialDimensions="3"
+				units="liter" multi:isType="false" />
+		</listOfCompartments>
+		<!-- speciesType -->
+		<multi:listOfSpeciesTypes>
+			<!-- EGF(R) -->
+			<multi:bindingSiteSpeciesType
+				multi:id="st_EGF_bs_R" />
+			<multi:speciesType multi:id="st_EGF">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="R"
+						multi:speciesType="st_EGF_bs_R" />
+				</multi:listOfSpeciesTypeInstances>
+			</multi:speciesType>
+			<!-- EGFR(L,CR1,Y1068 ̃U ̃P) -->
+			<multi:bindingSiteSpeciesType
+				multi:id="st_EGFR_bs_L" />
+			<multi:bindingSiteSpeciesType
+				multi:id="st_EGFR_bs_CR1" />
+			<multi:bindingSiteSpeciesType
+				multi:id="st_EGFR_bs_Y1068">
+				<multi:listOfSpeciesFeatureTypes>
+					<multi:speciesFeatureType
+						multi:id="sft_Y1068">
+						<multi:listOfPossibleSpeciesFeatureValues>
+							<multi:possibleSpeciesFeatureValue
+								multi:id="U" />
+							<multi:possibleSpeciesFeatureValue
+								multi:id="P" />
+						</multi:listOfPossibleSpeciesFeatureValues>
+					</multi:speciesFeatureType>
+				</multi:listOfSpeciesFeatureTypes>
+			</multi:bindingSiteSpeciesType>
+			<multi:speciesType multi:id="st_EGFR">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="L"
+						multi:speciesType="st_EGFR_bs_L" />
+					<multi:component multi:id="CR1"
+						multi:speciesType="st_EGFR_bs_CR1" />
+					<multi:component multi:id="Y1068"
+						multi:speciesType="st_EGFR_bs_Y1068" />
+				</multi:listOfSpeciesTypeInstances>
+			</multi:speciesType>
+			<!-- EGFR dimer: [EGFR(CR1!1).EGFR(CR1!1)] -->
+			<multi:speciesType multi:id="st_EGFR_dimer">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="EGFR1"
+						multi:speciesType="st_EGFR" />
+					<multi:component multi:id="EGFR2"
+						multi:speciesType="st_EGFR" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfSpeciesTypeComponentIndexes>
+					<multi:speciesTypeComponentIndex
+						multi:id="EGFR1CR1" multi:component="CR1"
+						identifyingParent="EGFR1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="EGFR2CR1" multi:component="CR1"
+						identifyingParent="EGFR2" />
+				</multi:listOfSpeciesTypeComponentIndexes>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="EGFR1CR1" multi:bindingSite2="EGFR2CR1" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+			<!-- EGFR-EGF dimer: [EGF(R!1).EGF(R!2).EGFR(L!1,CR1!3).EGFR(L!2,CR1!3)] -->
+			<multi:speciesType multi:id="st_EGFR_EGF_dimer">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="EGF1"
+						multi:speciesType="st_EGF" />
+					<multi:component multi:id="EG2"
+						multi:speciesType="st_EGF" />
+					<multi:component multi:id="EGFR1"
+						multi:speciesType="st_EGFR" />
+					<multi:component multi:id="EGFR2"
+						multi:speciesType="st_EGFR" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfSpeciesTypeComponentIndexes>
+					<multi:speciesTypeComponentIndex
+						multi:id="EGF1R" multi:component="R" identifyingParent="EGF1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="EGF2R" multi:component="R" identifyingParent="EGF2" />
+					<multi:speciesTypeComponentIndex
+						multi:id="EGFR1L" multi:component="L" identifyingParent="EGFR1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="EGFR2L" multi:component="L" identifyingParent="EGFR2" />
+					<multi:speciesTypeComponentIndex
+						multi:id="EGFR1CR1" multi:component="CR1"
+						identifyingParent="EGFR1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="EGFR2CR1" multi:component="CR1"
+						identifyingParent="EGFR2" />
+				</multi:listOfSpeciesTypeComponentIndexes>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="EGFR1CR1" multi:bindingSite2="EGFR2CR1" />
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="EGF1R" multi:bindingSite2="EGFR1L" />
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="EGF2R" multi:bindingSite2="EGFR2L" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+			<!-- Grb2(SH2, SH3) -->
+			<multi:bindingSiteSpeciesType
+				multi:id="st_Grb2_bs_SH2" />
+			<multi:bindingSiteSpeciesType
+				multi:id="st_Grb2_bs_SH3" />
+			<multi:speciesType multi:id="st_Grb2">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="SH2"
+						multi:speciesType="st_Grb2_bs_SH2" />
+					<multi:component multi:id="SH3"
+						multi:speciesType="st_Grb2_bs_SH3" />
+				</multi:listOfSpeciesTypeInstances>
+			</multi:speciesType>
+			<!-- Sos1 -->
+			<multi:bindingSiteSpeciesType
+				multi:id="st_Sos1_bs_PxxP" />
+			<multi:speciesType multi:id="st_Sos1">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="PxxP"
+						multi:speciesType="st_Sos1_bs_PxxP" />
+				</multi:listOfSpeciesTypeInstances>
+			</multi:speciesType>
+			<!-- Trash -->
+			<multi:speciesType multi:id="trash" />
+			<!-- Grb2-Sos1 -->
+			<multi:speciesType multi:id="st_Grb2_Sos1">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="Grb2"
+						multi:speciesType="st_Grb2" />
+					<multi:component multi:id="Sos1"
+						multi:speciesType="st_Sos1" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="SH3" multi:bindingSite2="PxxP" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+			<!-- EGFR(Y1068!1).Grb1(SH2!1,SH3!2).Sos1(PxxP!2) -->
+			<multi:speciesType multi:id="st_EGFR_Grb2_Sos1">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="EGFR"
+						multi:speciesType="st_EGFR" />
+					<multi:component multi:id="Grb2"
+						multi:speciesType="st_Grb2" />
+					<multi:component multi:id="Sos1"
+						multi:speciesType="st_Sos1" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="Y1068" multi:bindingSite2="SH2" />
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="SH3" multi:bindingSite2="PxxP" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+			<!-- EGFR(L!1).EGF(R!1) -->
+			<multi:speciesType multi:id="st_EGFR_EGF">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="EGFR"
+						multi:speciesType="st_EGFR" />
+					<multi:component multi:id="EGF"
+						multi:speciesType="st_EGF" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="L" multi:bindingSite2="R" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+			<!-- EGFR(Y1068!1).Grb2(SH2!1) -->
+			<multi:speciesType multi:id="st_EGFR_Grb2">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:component multi:id="EGFR"
+						multi:speciesType="st_EGFR" />
+					<multi:component multi:id="Grb2"
+						multi:speciesType="st_Grb2" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="Y1068" multi:bindingSite2="SH2" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+		</multi:listOfSpeciesTypes>
+		<!-- species -->
+		<listOfSpecies>
+			<species id="sp_EGF_free" name="EGF(R)"
+				multi:speciesType="st_EGF" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="R" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_EGFR_free_U" name="EGFR(L,CR1,Y1068 ̃U)"
+				multi:speciesType="st_EGFR" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="L" multi:bindingStatus="unbound" />
+					<multi:outwardBindingSite
+						multi:component="CR1" multi:bindingStatus="unbound" />
+					<multi:outwardBindingSite
+						multi:component="Y1068" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="sft_Y1068">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="U" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+			<species id="sp_Grb2_free" name="Grb2(SH2,SH3)"
+				multi:speciesType="st_Grb2" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="SH2" multi:bindingStatus="unbound" />
+					<multi:outwardBindingSite
+						multi:component="SH3" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_Grb2_SH2" name="Grb2(SH2)"
+				multi:speciesType="st_Grb2" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="SH2" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_Grb2_SH3" name="Grb2(SH3)"
+				multi:speciesType="st_Grb2" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="SH3" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_Sos1_free" name="Sos1(PxxP)"
+				multi:speciesType="st_Sos1" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="PxxP" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_EGF_tot" name="EGF()"
+				multi:speciesType="st_EGF" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false" />
+			<species id="sp_EGFR_dimerized" name="EGFR(CR1!+)"
+				multi:speciesType="st_EGFR" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="CR1" multi:bindingStatus="bound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_EGFR_U" name="EGFR(Y1068 ̃P!?)"
+				multi:speciesType="st_EGFR" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="sft_Y1068">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="P" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+			<species id="sp_EGFR_L_CR1" name="EGFR(L,CR1)"
+				multi:speciesType="st_EGFR" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="L" multi:bindingStatus="unbound" />
+					<multi:outwardBindingSite
+						multi:component="CR1" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_EGFR_EGF_CR1" name="EGFR(L!1,CR1).EGF(R!1)"
+				multi:speciesType="st_EGFR_EGF" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="CR1" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_EGFR_bL_CR1" name="EGFR(L!+,CR1)"
+				multi:speciesType="st_EGFR" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="L" multi:bindingStatus="bound" />
+					<multi:outwardBindingSite
+						multi:component="CR1" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_EGFR_dimer_bL"
+				name="EGFR(L!+,CR1!1).EGFR(L!+,CR1!1)"
+				multi:speciesType="st_EGFR_dimer" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="EGFR1L" multi:bindingStatus="bound" />
+					<multi:outwardBindingSite
+						multi:component="EGFR2L" multi:bindingStatus="bound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<species id="sp_EGFR_EGF_dimer"
+				name="EGF(R!1).EGF(R!2).EGFR(L!1,CR1!3).EGFR(L!2,CR1!3)"
+				multi:speciesType="st_EGFR_EGF_dimer" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false" />
+			<species id="sp_EGFR_bCR1_Y1068_U"
+				name="EGFR(CR1!+,Y1068 ̃U)" multi:speciesType="st_EGFR"
+				hasOnlySubstanceUnits="false" boundaryCondition="false"
+				constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="CR1" multi:bindingStatus="bound" />
+					<multi:outwardBindingSite
+						multi:component="Y1068" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="sft_Y1068">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="U" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+			<species id="sp_EGFR_bCR1_Y1068_P"
+				name="EGFR(CR1!+,Y1068 ̃P)" multi:speciesType="st_EGFR"
+				hasOnlySubstanceUnits="false" boundaryCondition="false"
+				constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="CR1" multi:bindingStatus="bound" />
+					<multi:outwardBindingSite
+						multi:component="Y1068" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="sft_Y1068">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="P" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+			<species id="sp_EGFR_Y1068_P" name="EGFR(Y1068 ̃P)"
+				multi:speciesType="st_EGFR" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="Y1068" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="sft_Y1068">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="P" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+			<species id="sp_EGFR_Y1068_U" name="EGFR(Y1068 ̃U)"
+				multi:speciesType="st_EGFR" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="Y1068" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="sft_Y1068">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="U" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+			<species id="sp_EGFR_Grb2_P"
+				name="EGFR(Y1068 ̃P!1).Grb2(SH2!1)" multi:speciesType="st_EGFR_Grb2"
+				hasOnlySubstanceUnits="false" boundaryCondition="false"
+				constant="false">
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="sft_Y1068">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="P" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+			<species id="sp_Grb2_Sos1" name="Grb2(SH3!1).Sos1(PxxP!1)"
+				multi:speciesType="st_Grb2_Sos1" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false" />
+			<species id="sp_Trash" name="Trash()"
+				multi:speciesType="st_Trash" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false" />
+		</listOfSpecies>
+		<!-- parameters -->
+		<listOfParameters>
+			<parameter id="NA" value="6.02e23" constant="true"
+				units="molecules_per_mol" />
+			<parameter id="f" value="1" constant="true" />
+			<parameter id="kp1" constant="true" />
+			<parameter id="km1" value="0.06" constant="true" />
+			<parameter id="kp2" constant="true" />
+			<parameter id="km2" value="0.1" constant="true" />
+			<parameter id="kp3" value="0.5" constant="true" />
+			<parameter id="km3" value="4.505" constant="true" />
+			<parameter id="kp4" constant="true" />
+			<parameter id="km4" value="0.05" constant="true" />
+			<parameter id="kp5" constant="true" />
+			<parameter id="km5" value="0.06" constant="true" />
+			<parameter id="deg" value="0.01" constant="true" />
+		</listOfParameters>
+		<!-- intiialAssignments -->
+		<listOfIntialAssignments>
+			<initialAssignment symbol="Vo">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<times />
+						<ci>f</ci>
+						<cn> 1e-10 </cn>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="V">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<times />
+						<ci>f</ci>
+						<cn> 3e-12 </cn>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="kp1">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<divide />
+						<cn>9.02e7</cn>
+						<apply>
+							<times />
+							<ci>NA</ci>
+							<ci>Vo</ci>
+						</apply>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="kp2">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<divide />
+						<cn>1.0e7</cn>
+						<apply>
+							<times />
+							<ci>NA</ci>
+							<ci>V</ci>
+						</apply>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="kp4">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<divide />
+						<cn>1.5e6</cn>
+						<apply>
+							<times />
+							<ci>NA</ci>
+							<ci>V</ci>
+						</apply>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="kp5">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<divide />
+						<cn>1.0e7</cn>
+						<apply>
+							<times />
+							<ci>NA</ci>
+							<ci>V</ci>
+						</apply>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="sp_EGF_free">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<times />
+						<cn>20</cn>
+						<cn>1e-9</cn>
+						<ci>NA</ci>
+						<ci>Vo</ci>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="sp_EGFR_free_U">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<times />
+						<ci>f</ci>
+						<cn>1.8e5</cn>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="sp_Grb2_free">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<times />
+						<ci>f</ci>
+						<cn>1.5e5</cn>
+					</apply>
+				</math>
+			</initialAssignment>
+			<initialAssignment symbol="sp_Sos1_free">
+				<math xmls="http://www.w3.org/1998/Math/MathML">
+					<apply>
+						<times />
+						<ci>f</ci>
+						<cn>6.2e4</cn>
+					</apply>
+				</math>
+			</initialAssignment>
+		</listOfIntialAssignments>
+		<!-- reactions -->
+		<listOfReactions>
+			<!-- # Ligand-receptor binding -->
+			<!-- 1 EGFR(L,CR1) + EGF(R) <-> EGFR(L!1,CR1).EGF(R!1) kp1, km1 -->
+			<reaction id="rc_Ligand_receptor_binding" reversible="true"
+				fast="false">
+				<listOfReactants>
+					<speciesReference species="sp_EGFR_L_CR1"
+						constant="false" />
+					<speciesReference species="sp_EGF_free"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_EGFR_EGF_CR1"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<minus />
+							<apply>
+								<times />
+								<ci> kp1 </ci>
+								<ci> sp_EGFR_L_CR1 </ci>
+								<ci> sp_EGF_free </ci>
+							</apply>
+							<apply>
+								<times />
+								<ci> km1 </ci>
+								<ci> sp_EGFR_EGF_CR1 </ci>
+							</apply>
+						</apply>
+					</math>
+				</kineticLaw>
+			</reaction>
+			<!-- # Receptor-aggregation -->
+			<!-- 2 EGFR(L!+,CR1) + EGFR(L!+,CR1) <-> EGFR(L!+,CR1!1).EGFR(L!+,CR1!1) 
+				kp2,km2 -->
+			<reaction id="rc_Receptor_aggregation" reversible="true"
+				fast="false">
+				<listOfReactants>
+					<speciesReference species="sp_EGFR_bL_CR1"
+						constant="false" stoichiometry="2" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_EGFR_dimer_bL"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<minus />
+							<apply>
+								<times />
+								<ci> kp2 </ci>
+								<ci> sp_EGFR_bL_CR1 </ci>
+								<ci> sp_EGFR_bL_CR1 </ci>
+							</apply>
+							<apply>
+								<times />
+								<ci> km3 </ci>
+								<ci> sp_EGFR_dimer_bL </ci>
+							</apply>
+						</apply>
+					</math>
+				</kineticLaw>
+			</reaction>
+			<!-- # Transphosphorylation of EGFR by RTK -->
+			<!-- 3 EGFR(CR1!+,Y1068 ̃U) -> EGFR(CR1!+,Y1068 ̃P) kp3 -->
+			<reaction id="rc_Transphosphorylation" reversible="false"
+				fast="false">
+				<listOfReactants>
+					<speciesReference species="sp_EGFR_bCR1_Y1068_U"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_EGFR_bCR1_Y1068_P"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci>kp3</ci>
+							<ci>sp_EGFR_bCR1_Y1068_U</ci>
+						</apply>
+					</math>
+				</kineticLaw>
+			</reaction>
+			<!-- # Dephosphorylation -->
+			<!-- 4 EGFR(Y1068 ̃P) -> EGFR(Y1068 ̃U) km3 -->
+			<reaction id="rc_Dephosphorylation" reversible="false"
+				fast="false">
+				<listOfReactants>
+					<speciesReference species="sp_EGFR_Y1068_P"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_EGFR_Y1068_U"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci>km3</ci>
+							<ci>sp_EGFR_Y1068_P</ci>
+						</apply>
+					</math>
+				</kineticLaw>
+			</reaction>
+			<!-- # Grb2 binding to pY1068 -->
+			<!-- 5 EGFR(Y1068 ̃P) + Grb2(SH2) <-> EGFR(Y1068 ̃P!1).Grb2(SH2!1) kp4,km4 -->
+			<reaction id="rc_Grb2_binding_to_pY1068" reversible="true"
+				fast="false">
+				<listOfReactants>
+					<speciesReference species="sp_EGFR_Y1068_P"
+						constant="false" />
+					<speciesReference species="sp_Grb2_SH2"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_EGFR_Grb2_P"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<minus />
+							<apply>
+								<times />
+								<ci> kp4 </ci>
+								<ci> sp_EGFR_Y1068_P </ci>
+								<ci> sp_Grb2_SH2 </ci>
+							</apply>
+							<apply>
+								<times />
+								<ci> km4 </ci>
+								<ci> sp_EGFR_Grb2_P </ci>
+							</apply>
+						</apply>
+					</math>
+				</kineticLaw>
+			</reaction>
+			<!-- # Grb2 binding to Sos1 -->
+			<!-- 6 Grb2(SH3) + Sos1(PxxP) <-> Grb2(SH3!1).Sos1(PxxP!1) kp5,km5 -->
+			<reaction id="rc_Grb2_binding_to_Sos1" reversible="true"
+				fast="false">
+				<listOfReactants>
+					<speciesReference species="sp_Grb2_SH3"
+						constant="false" />
+					<speciesReference species="sp_Sos1_free"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_Grb2_Sos1"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<minus />
+							<apply>
+								<times />
+								<ci> kp5 </ci>
+								<ci> sp_Grb2_SH3 </ci>
+								<ci> sp_Sos1_free </ci>
+							</apply>
+							<apply>
+								<times />
+								<ci> km5 </ci>
+								<ci> sp_Grb2_Sos1 </ci>
+							</apply>
+						</apply>
+					</math>
+				</kineticLaw>
+			</reaction>
+			<!-- # Receptor dimer internalization/degradation -->
+			<!-- 7 EGF(R!1).EGF(R!2).EGFR(L!1,CR1!3).EGFR(L!2,CR1!3) -> Trash() -->
+			<reaction id="rc_EGFR_EGF_dimer_degration"
+				reversible="false" fast="false">
+				<listOfReactants>
+					<speciesReference species="sp_EGFR_EGF_dimer"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_Trash"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci>deg</ci>
+							<ci>sp_EGFR_EGF_dimer</ci>
+						</apply>
+					</math>
+				</kineticLaw>
+			</reaction>
+		</listOfReactions>
+	</model>
+</sbml>
\ No newline at end of file
diff --git a/converter-sbml/testFiles/multi/ecad.xml b/converter-sbml/testFiles/multi/ecad.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4fb0fafa48b9d270203dbdf48990401ebb125587
--- /dev/null
+++ b/converter-sbml/testFiles/multi/ecad.xml
@@ -0,0 +1,554 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core"
+	level="3" version="1"
+	xmlns:multi="http://www.sbml.org/sbml/level3/version1/multi/version1"
+	multi:required="true">
+	<model name="E-cadherin_mediated_adhesion">
+		<!-- Definitions -->
+		<listOfUnitDefinitions>
+			<unitDefinition id="litre_per_mole_per_sec">
+				<listOfUnits>
+					<unit kind="litre" exponent="1" scale="0" multiplier="1" />
+					<unit kind="mole" exponent="-1" scale="0" multiplier="1" />
+					<unit kind="second" exponent="-1" scale="0" multiplier="1" />
+				</listOfUnits>
+			</unitDefinition>
+			<unitDefinition id="micron_square_per_sec">
+				<listOfUnits>
+					<unit kind="metre" exponent="2" scale="-6" multiplier="1" />
+					<unit kind="second" exponent="-1" scale="0" multiplier="1" />
+				</listOfUnits>
+			</unitDefinition>
+			<unitDefinition id="micrometre_per_sec">
+				<listOfUnits>
+					<unit kind="metre" exponent="1" scale="-6" multiplier="1" />
+					<unit kind="second" exponent="-1" scale="0" multiplier="1" />
+				</listOfUnits>
+			</unitDefinition>
+			<unitDefinition id="per_sec">
+				<listOfUnits>
+					<unit kind="second" exponent="-1" scale="0" multiplier="1" />
+				</listOfUnits>
+			</unitDefinition>
+		</listOfUnitDefinitions>
+		<!-- Compartments -->
+		<listOfCompartments>
+			<compartment id="membrane" constant="true"
+				multi:isType="true" />
+			<compartment id="inter_membrane" constant="true"
+				multi:isType="true">
+				<multi:listOfCompartmentReferences>
+					<multi:compartmentReference
+						multi:id="m1" multi:compartment="membrane" />
+					<multi:compartmentReference
+						multi:id="m2" multi:compartment="membrane" />
+				</multi:listOfCompartmentReferences>
+			</compartment>
+		</listOfCompartments>
+		<!-- SpeciesTypes -->
+		<multi:listOfSpeciesTypes>
+			<!-- Ecad with cis-binding site and trans-binding site: -->
+			<multi:bindingSiteSpeciesType
+				multi:id="st_Cis_Interface" />
+			<multi:bindingSiteSpeciesType
+				multi:id="st_Trans_Interface" />
+			<multi:speciesType multi:id="st_Ecad"
+				multi:compartment="membrane">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:speciesTypeInstance multi:id="cis"
+						multi:speciesType="st_Cis_Interface" />
+					<multi:speciesTypeInstance
+						multi:id="trans" multi:speciesType="st_Trans_Interface" />
+				</multi:listOfSpeciesTypeInstances>
+			</multi:speciesType>
+			<!-- cis dimer: -->
+			<multi:speciesType multi:id="st_Ecad_cis_dimer"
+				multi:compartment="membrane">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:speciesTypeInstance
+						multi:id="Ecad1" multi:speciesType="st_Ecad" />
+					<multi:speciesTypeInstance
+						multi:id="Ecad_2" multi:speciesType="st_Ecad" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfSpeciesTypeComponentIndexes>
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad1cis" multi:component="cis"
+						multi:identifyingParent="Ecad1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad2cis" multi:component="cis"
+						multi:identifyingParent="Ecad2" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad1trans" multi:component="trans"
+						multi:identifyingParent="Ecad1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad2trans" multi:component="trans"
+						multi:identifyingParent="Ecad2" />
+				</multi:listOfSpeciesTypeComponentIndexes>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="Ecad1cis" multi:bindingSite2="Ecad2cis" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+			<!-- trans dimer: -->
+			<multi:speciesType multi:id="st_Ecad_trans_dimer"
+				multi:compartment="inter_membrane">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:speciesTypeInstance
+						multi:id="Ecad1" multi:speciesType="st_Ecad"
+						multi:compartmentReference="m1" />
+					<multi:speciesTypeInstance
+						multi:id="Ecad2" multi:speciesType="st_Ecad"
+						multi:compartmentReference="m2" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfSpeciesTypeComponentIndexes>
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad1trans" multi:component="trans"
+						multi:identifyingParent="Ecad1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad2trans" multi:component="trans"
+						multi:identifyingParent="Ecad2" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad1cis" multi:component="cis"
+						multi:identifyingParent="Ecad1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad2cis" multi:component="cis"
+						multi:identifyingParent="Ecad2" />
+				</multi:listOfSpeciesTypeComponentIndexes>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="Ecad1trans" multi:bindingSite2="Ecad2trans" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+			<!-- trimer: -->
+			<multi:speciesType multi:id="st_Ecad_trimer"
+				multi:compartment="inter_membrane">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:speciesTypeInstance
+						multi:id="Ecad1" multi:speciesType="st_Ecad"
+						multi:compartmentReference="m1" />
+					<multi:speciesTypeInstance
+						multi:id="Ecad2" multi:speciesType="st_Ecad"
+						multi:compartmentReference="m1" />
+					<multi:speciesTypeInstance
+						multi:id="Ecad3" multi:speciesType="st_Ecad"
+						multi:compartmentReference="m2" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfSpeciesTypeComponentIndexes>
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad1cis" multi:component="cis"
+						multi:identifyingParent="Ecad1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad1trans" multi:component="trans"
+						multi:identifyingParent="Ecad1" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad2cis" multi:component="cis"
+						multi:identifyingParent="Ecad2" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad2trans" multi:component="trans"
+						multi:identifyingParent="Ecad2" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad3cis" multi:component="cis"
+						multi:identifyingParent="Ecad3" />
+					<multi:speciesTypeComponentIndex
+						multi:id="Ecad3trans" multi:component="trans"
+						multi:identifyingParent="Ecad3" />
+				</multi:listOfSpeciesTypeComponentIndexes>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="Ecad1cis" multi:bindingSite2="Ecad2cis" />
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="Ecad1trans" multi:bindingSite2="Ecad3trans" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+		</multi:listOfSpeciesTypes>
+		<!-- Species -->
+		<listOfSpecies>
+			<!-- free Ecad -->
+			<species id="sp_Ecad_unbound" name="Ecad_unbound"
+				compartment="membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="cis" multi:bindingStatus="unbound" />
+					<multi:outwardBindingSite
+						multi:component="trans" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad trans unbnd -->
+			<species id="sp_Ecad_trans_unbnd" name="Ecad_trans_unbnd"
+				compartment="membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="trans" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad trans bnd -->
+			<species id="sp_Ecad_trans_bnd" name="Ecad_trans_bnd"
+				compartment="membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="trans" multi:bindingStatus="bound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad all -->
+			<species id="sp_Ecad_all" name="Ecad_all"
+				compartment="membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad" />
+			<!-- Pattern species: Ecad cis unbnd -->
+			<species id="sp_Ecad_cis_unbnd" name="Ecad_cis_unbnd"
+				compartment="membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="cis" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad cis unbnd, trans bnd -->
+			<species id="sp_Ecad_6" name="Ecad_6" compartment="membrane"
+				hasOnlySubstanceUnits="false" boundaryCondition="false"
+				constant="false" multi:speciesType="st_Ecad">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="cis" multi:bindingStatus="unbound" />
+					<multi:outwardBindingSite
+						multi:component="trans" multi:bindingStatus="bound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad cis bnd, trans unbnd -->
+			<species id="sp_Ecad_7" name="Ecad_7" compartment="membrane"
+				hasOnlySubstanceUnits="false" boundaryCondition="false"
+				constant="false" multi:speciesType="st_Ecad">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="cis" multi:bindingStatus="bound" />
+					<multi:outwardBindingSite
+						multi:component="trans" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad cis dimer -->
+			<species id="sp_Ecad_cis_dimer" name="Ecad_cis_dimer"
+				compartment="membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad_cis_dimer" />
+			<!-- Pattern species: Ecad cis dimer: all trans bnd -->
+			<species id="sp_EcadEcad_2" name="Ecad.Ecad_2"
+				compartment="membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad_cis_dimer">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="Ecad1trans" multi:bindingStatus="bound" />
+					<multi:outwardBindingSite
+						multi:component="Ecad2trans" multi:bindingStatus="bound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad trans dimer -->
+			<species id="sp_EcadEcad_1" name="Ecad.Ecad_1"
+				compartment="inter_membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad_trans_dimer" />
+			<!-- Pattern species: Ecad trans dimer: all cis bnd -->
+			<species id="sp_Ecad_trans_dimer_2" name="Ecad_trans_dimer_2"
+				compartment="inter_membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad_trans_dimer">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="Ecad1cis" multi:bindingStatus="bound" />
+					<multi:outwardBindingSite
+						multi:component="Ecad2cis" multi:bindingStatus="bound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad True Trimer -->
+			<species id="sp_Ecad_True_Trimer"
+				compartment="inter_membrane" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false"
+				multi:speciesType="st_Ecad_trimer">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="Ecad2trans" multi:bindingStatus="unbound" />
+					<multi:outwardBindingSite
+						multi:component="Ecad3cis" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- Pattern species: Ecad All Trimer -->
+			<species id="sp_Ecad_All_Trimer" compartment="inter_membrane"
+				hasOnlySubstanceUnits="false" boundaryCondition="false"
+				constant="false" multi:speciesType="st_Ecad_trimer" />
+		</listOfSpecies>
+		<!-- Reactions -->
+		<listOfReactions>
+			<!-- cis association: -->
+			<reaction id="rc_Cis_Association" name="Cis_Association"
+				reversible="false" fast="false" compartment="membrane">
+				<listOfReactants>
+					<speciesReference id="Cis_Association_r1"
+						species="sp_Ecad_6" stoichiometry="1" constant="false" />
+					<speciesReference id="Cis_Association_r2"
+						species="sp_Ecad_6" stoichiometry="1" constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_EcadEcad_2"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci> kon </ci>
+							<ci multi:speciesReference="Cis_Association_r1"> sp_Ecad_6 </ci>
+							<ci multi:speciesReference="Cis_Association_r2"> sp_Ecad_6 </ci>
+						</apply>
+					</math>
+					<listOfLocalParameters>
+						<localParameter id="kon" value="9000"
+							units="litre_per_mole_per_sec" />
+					</listOfLocalParameters>
+				</kineticLaw>
+			</reaction>
+			<!-- In species cis association: Here the model requires that the two 
+				interacting molecules are part of one connected complex already prior to 
+				the association. Since the necessary connectivity can only be mediated by 
+				the trans binding sites here, these sites must be bound to the subcomplex 
+				(not shown) linking the two interacting molecules. -->
+			<multi:intraSpeciesReaction
+				id="rc_Intra_Complex_Cis_Association"
+				name="Intra-Complex_Cis_Association" reversible="false" fast="false"
+				compartment="membrane">
+				<listOfReactants>
+					<speciesReference
+						id="Intra_Complex_Cis_Association_r1" species="sp_Ecad_6"
+						stoichiometry="1" constant="false" />
+					<speciesReference
+						id="Intra_Complex_Cis_Association_r2" species="sp_Ecad_6"
+						stoichiometry="1" constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_EcadEcad_2"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci> kon </ci>
+							<ci multi:speciesReference="Intra_Complex_Cis_Association_r1"> sp_Ecad_6 </ci>
+						</apply>
+					</math>
+					<listOfLocalParameters>
+						<localParameter id="kon" value="100"
+							units="per_sec" />
+					</listOfLocalParameters>
+				</kineticLaw>
+			</multi:intraSpeciesReaction>
+			<!-- trans association: -->
+			<reaction id="rc_Trans_Association" name="Trans_Association"
+				reversible="false" fast="false" compartment="inter_membrane">
+				<listOfReactants>
+					<speciesReference id="Trans_Association_r1"
+						species="sp_Ecad_trans_unbnd" multi:compartmentReference="m1"
+						constant="false" />
+					<speciesReference id="Trans_Association_r2"
+						species="sp_Ecad_trans_unbnd" multi:compartmentReference="m2"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_EcadEcad_1"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci> kon </ci>
+							<ci multi:speciesReference="Trans_Association_r1"> sp_Ecad_trans_unbnd </ci>
+							<ci multi:speciesReference="Trans_Association_r2"> sp_Ecad_trans_unbnd </ci>
+						</apply>
+					</math>
+					<listOfLocalParameters>
+						<localParameter id="kon" value="90000"
+							units="litre_per_mole_per_sec" />
+					</listOfLocalParameters>
+				</kineticLaw>
+			</reaction>
+			<!-- In complex trans association: Here the model requires that the two 
+				interacting molecules are part of one connected complex already prior to 
+				the association. Since the necessary connectivity can only be mediated by 
+				the cis binding sites here, these sites must be bound to the subcomplex (not 
+				shown) linking the two interacting molecules. -->
+			<multi:intraSpeciesReaction
+				id="rc_Intra_Complex_Trans_Association"
+				name="Intra-Complex_Trans_Association" reversible="false"
+				fast="false" compartment="inter_membrane">
+				<listOfReactants>
+					<speciesReference
+						id="Intra_Complex_Trans_Association_r1" species="sp_Ecad_7"
+						multi:compartmentReference="m1" constant="false" />
+					<speciesReference
+						id="Intra_Complex_Trans_Association_r2" species="sp_Ecad_7"
+						multi:compartmentReference="m2" constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_Ecad_trans_dimer_2"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci> kon </ci>
+							<ci
+								multi:speciesReference="Intra_Complex_Trans_Association_r1"> sp_Ecad_7 </ci>
+						</apply>
+					</math>
+					<listOfLocalParameters>
+						<localParameter id="kon" value="100"
+							units="per_sec" />
+					</listOfLocalParameters>
+				</kineticLaw>
+			</multi:intraSpeciesReaction>
+			<!-- cis dissociation: -->
+			<reaction id="rc_Cis_dissociation" name="Cis_dissociation"
+				reversible="false" fast="false" compartment="membrane">
+				<listOfReactants>
+					<speciesReference species="sp_Ecad_cis_dimer"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference id="Cis_dissociation_p1"
+						species="sp_Ecad_cis_unbnd" stoichiometry="1" constant="false" />
+					<speciesReference id="Cis_dissociation_p2"
+						species="sp_Ecad_cis_unbnd" stoichiometry="1" constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci> koff </ci>
+							<ci> sp_Ecad_cis_unbnd </ci>
+						</apply>
+					</math>
+					<listOfLocalParameters>
+						<localParameter id="koff" value="1" units="per_sec" />
+					</listOfLocalParameters>
+				</kineticLaw>
+			</reaction>
+			<!-- In-species cis dissociation: By specifying that this reaction breaks 
+				only an inner bond, the model limits the application of this reaction to 
+				dissociations that result in only one reaction product. The complex is still 
+				connected through a subcomplex that is not shown here but that links the 
+				two molecules involved in the reaction at their trans binding sites. Note 
+				that the modeler application has to ensure the correct application of this 
+				rule and its consistent definition. For instance, specifying the one or both 
+				of the trans binding sites to be unbound would lead to a rule that could 
+				never be applied because the trans bindings are required for the connectivity 
+				of the result complex. -->
+			<multi:intraSpeciesReaction
+				id="rc_Intra_Complex_Cis_dissociation"
+				name="Intra-Complex_Cis_dissociation" reversible="false"
+				fast="false" compartment="membrane">
+				<listOfReactants>
+					<speciesReference species="sp_EcadEcad_2"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference
+						id="Intra_Complex_Cis_dissociation_p1" species="sp_Ecad_6"
+						stoichiometry="2" constant="false" />
+					<speciesReference
+						id="Intra_Complex_Cis_dissociation_p2" species="sp_Ecad_6"
+						stoichiometry="2" constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci> koff </ci>
+							<ci> sp_Ecad_6 </ci>
+						</apply>
+					</math>
+					<listOfLocalParameters>
+						<localParameter id="koff" value="0.01"
+							units="per_sec" />
+					</listOfLocalParameters>
+				</kineticLaw>
+			</multi:intraSpeciesReaction>
+			<!-- trans dissociation: -->
+			<reaction id="rc_Trans_dissociation"
+				name="Trans_dissociation" reversible="false" fast="false"
+				compartment="inter_membrane">
+				<listOfReactants>
+					<speciesReference species="sp_EcadEcad_1"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference id="Trans_dissociation_p1"
+						species="sp_Ecad_trans_unbnd" multi:compartmentReference="m1"
+						constant="false" />
+					<speciesReference id="Trans_dissociation_p2"
+						species="sp_Ecad_trans_unbnd" multi:compartmentReference="m2"
+						constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci> koff </ci>
+							<ci> sp_Ecad_trans_unbnd </ci>
+						</apply>
+					</math>
+					<listOfLocalParameters>
+						<localParameter id="koff" value="1" units="per_sec" />
+					</listOfLocalParameters>
+				</kineticLaw>
+			</reaction>
+			<!-- In species trans dissociation: By specifying that this reaction breaks 
+				only an inner bond, the model limits the application of this reaction to 
+				dissociations that result in only one reaction product. The complex is still 
+				connected through a subcomplex that is not shown here but that links the 
+				two molecules involved in the reaction at their cis binding sites. Note that 
+				the modeler application has to ensure the correct application of this rule 
+				and its consistent definition. For instance, specifying the one or both of 
+				the cis binding sites to be unbound would lead to a rule that could never 
+				be applied because the cis bindings are required for the connectivity of 
+				the result complex. -->
+			<multi:intraSpeciesReaction
+				id="rc_Intra_Complex_Trans_dissociation"
+				name="Intra-Complex_Trans_dissociation" reversible="false"
+				fast="false" compartment="inter_membrane">
+				<listOfReactants>
+					<speciesReference species="sp_Ecad_trans_dimer_2"
+						constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference
+						id="Intra_Complex_Trans_dissociation_p1" species="sp_Ecad_7"
+						multi:compartmentReference="m1" constant="false" />
+					<speciesReference
+						id="Intra_Complex_Trans_dissociation_p2" species="sp_Ecad_7"
+						multi:compartmentReference="m2" constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+					<math xmlns="http://www.w3.org/1998/Math/MathML">
+						<apply>
+							<times />
+							<ci> koff </ci>
+							<ci> sp_Ecad_7 </ci>
+						</apply>
+					</math>
+					<listOfLocalParameters>
+						<localParameter id="koff" value="0.01"
+							units="per_sec" />
+					</listOfLocalParameters>
+				</kineticLaw>
+			</multi:intraSpeciesReaction>
+		</listOfReactions>
+	</model>
+</sbml>
\ No newline at end of file
diff --git a/converter-sbml/testFiles/multi/kappa.xml b/converter-sbml/testFiles/multi/kappa.xml
new file mode 100644
index 0000000000000000000000000000000000000000..da6428223c07e0a6714ebac667d9d326d0092162
--- /dev/null
+++ b/converter-sbml/testFiles/multi/kappa.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core"
+	level="3" version="1"
+	xmlns:multi="http://www.sbml.org/sbml/level3/version1/multi/version1"
+	multi:required="true">
+	<model name="An Introduction to Kappa Syntax">
+		<!-- speciesType -->
+		<multi:listOfSpeciesTypes>
+			<!-- A:Site1 -->
+			<multi:bindingSiteSpeciesType
+				multi:id="st_A_Site1">
+				<multi:listOfSpeciesFeatureTypes>
+					<multi:speciesFeatureType
+						multi:id="phosphorylation">
+						<multi:listOfPossibleSpeciesFeatureValues>
+							<multi:possibleSpeciesFeatureValue
+								multi:id="U" />
+							<multi:possibleSpeciesFeatureValue
+								multi:id="P" />
+						</multi:listOfPossibleSpeciesFeatureValues>
+					</multi:speciesFeatureType>
+				</multi:listOfSpeciesFeatureTypes>
+			</multi:bindingSiteSpeciesType>
+			<!-- A -->
+			<multi:speciesType multi:id="st_A">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:speciesTypeInstance
+						multi:id="Asite1" multi:speciesType="st_A_Site1" />
+				</multi:listOfSpeciesTypeInstances>
+			</multi:speciesType>
+			<!-- B:Site1 -->
+			<multi:bindingSiteSpeciesType
+				multi:id="st_B_Site1" />
+			<!-- B -->
+			<multi:speciesType multi:id="st_B">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:speciesTypeInstance
+						multi:id="Bsite1" multi:speciesType="st_B_Site1" />
+				</multi:listOfSpeciesTypeInstances>
+			</multi:speciesType>
+			<!-- A.B -->
+			<multi:speciesType multi:id="st_AB">
+				<multi:listOfSpeciesTypeInstances>
+					<multi:speciesTypeInstance multi:id="A"
+						multi:speciesType="st_A" />
+
+					<multi:speciesTypeInstance multi:id="B"
+						multi:speciesType="st_B" />
+				</multi:listOfSpeciesTypeInstances>
+				<multi:listOfInSpeciesTypeBonds>
+					<multi:inSpeciesTypeBond
+						multi:bindingSite1="Asite1" multi:bindingSite2="Bsite1" />
+				</multi:listOfInSpeciesTypeBonds>
+			</multi:speciesType>
+		</multi:listOfSpeciesTypes>
+		<!-- species -->
+		<listOfSpecies>
+			<!-- species A with free unphosphorylated Site1 -->
+			<species id="sp_A" name="A with Unphosphorylated Site 1"
+				multi:speciesType="st_A" hasOnlySubstanceUnits="false"
+				boundaryCondition="false" constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="Asite1" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="phosphorylation">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="U" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+			<!-- species B with free Site 1 -->
+			<species id="sp_B" name="B" multi:speciesType="st_B"
+				hasOnlySubstanceUnits="false" boundaryCondition="false"
+				constant="false">
+				<multi:listOfOutwardBindingSites>
+					<multi:outwardBindingSite
+						multi:component="sti_B_Site1" multi:bindingStatus="unbound" />
+				</multi:listOfOutwardBindingSites>
+			</species>
+			<!-- species AB: unphosphorylated -->
+			<species id="sp_AB" name="AB" multi:speciesType="st_AB"
+				hasOnlySubstanceUnits="false" boundaryCondition="false"
+				constant="false">
+				<multi:listOfSpeciesFeatures>
+					<multi:speciesFeature
+						multi:speciesFeatureType="phosphorylation">
+						<multi:listOfSpeciesFeatureValues>
+							<multi:speciesFeatureValue
+								multi:value="U" />
+						</multi:listOfSpeciesFeatureValues>
+					</multi:speciesFeature>
+				</multi:listOfSpeciesFeatures>
+			</species>
+		</listOfSpecies>
+		<!-- reactions -->
+		<listOfReactions>
+			<!-- Unphosphorylated Site1 of A binds to Site1 of B -->
+			<!-- Kappa Rule: A(Site1Ëœu),B(Site1) -> A(Site1Ëœu!1),B(Site1!1) -->
+			<reaction id="rc_AB" reversible="false" fast="false">
+				<listOfReactants>
+					<speciesReference species="sp_A" constant="false" />
+					<speciesReference species="sp_B" constant="false" />
+				</listOfReactants>
+				<listOfProducts>
+					<speciesReference species="sp_AB" constant="false" />
+				</listOfProducts>
+				<kineticLaw>
+				</kineticLaw>
+			</reaction>
+		</listOfReactions>
+	</model>
+</sbml> 
\ No newline at end of file
diff --git a/converter-sbml/testFiles/multi_features/conflicting_species_type.xml b/converter-sbml/testFiles/multi_features/conflicting_species_type.xml
new file mode 100644
index 0000000000000000000000000000000000000000..877e47370e86a7940cbf5b02e5d4152ae93225d6
--- /dev/null
+++ b/converter-sbml/testFiles/multi_features/conflicting_species_type.xml
@@ -0,0 +1,24 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created by minerva version Unknown on 2018-12-31 at 12:23:42 CET with 
+	JSBML version 1.4. -->
+<sbml xmlns="http://www.sbml.org/sbml/level3/version2/core"
+	layout:required="false" level="3" multi:required="true"
+	render:required="false" version="2"
+	xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1"
+	xmlns:multi="http://www.sbml.org/sbml/level3/version1/multi/version1"
+	xmlns:render="http://www.sbml.org/sbml/level3/version1/render/version1">
+	<model id="id1" name="UNKNOWN DISEASE MAP">
+		<multi:listOfSpeciesTypes
+			xmlns:multi="http://www.sbml.org/sbml/level3/version1/multi/version1">
+			<multi:speciesType
+				multi:id="minerva_species_type_Gene" multi:name="Gene"
+				sboTerm="SBO:0000243" />
+		</multi:listOfSpeciesTypes>
+		<listOfSpecies>
+			<species id="species_0"
+				multi:speciesType="minerva_species_type_Gene" name="test name"
+				sboTerm="SBO:0000252">
+			</species>
+		</listOfSpecies>
+	</model>
+</sbml>
\ No newline at end of file
diff --git a/converter-sbml/testFiles/multi_features/species_type.xml b/converter-sbml/testFiles/multi_features/species_type.xml
new file mode 100644
index 0000000000000000000000000000000000000000..67357c9acfdb843803bdcb53c462a88b02dd1655
--- /dev/null
+++ b/converter-sbml/testFiles/multi_features/species_type.xml
@@ -0,0 +1,23 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created by minerva version Unknown on 2018-12-31 at 12:23:42 CET with 
+	JSBML version 1.4. -->
+<sbml xmlns="http://www.sbml.org/sbml/level3/version2/core"
+	layout:required="false" level="3" multi:required="true"
+	render:required="false" version="2"
+	xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1"
+	xmlns:multi="http://www.sbml.org/sbml/level3/version1/multi/version1"
+	xmlns:render="http://www.sbml.org/sbml/level3/version1/render/version1">
+	<model id="id1" name="UNKNOWN DISEASE MAP">
+		<multi:listOfSpeciesTypes
+			xmlns:multi="http://www.sbml.org/sbml/level3/version1/multi/version1">
+			<multi:speciesType
+				multi:id="minerva_species_type_Gene" multi:name="Gene"
+				sboTerm="SBO:0000243" />
+		</multi:listOfSpeciesTypes>
+		<listOfSpecies>
+			<species id="species_0"
+				multi:speciesType="minerva_species_type_Gene" name="test name">
+			</species>
+		</listOfSpecies>
+	</model>
+</sbml>
\ No newline at end of file
diff --git a/model-command/src/main/java/lcsb/mapviewer/commands/layout/ApplySimpleLayoutModelCommand.java b/model-command/src/main/java/lcsb/mapviewer/commands/layout/ApplySimpleLayoutModelCommand.java
index c2edd349dc00bb0716e27c67d9e2900d791bf53d..5881f26413d1e65a4666f2b1eb38592847bc4048 100644
--- a/model-command/src/main/java/lcsb/mapviewer/commands/layout/ApplySimpleLayoutModelCommand.java
+++ b/model-command/src/main/java/lcsb/mapviewer/commands/layout/ApplySimpleLayoutModelCommand.java
@@ -2,6 +2,7 @@ package lcsb.mapviewer.commands.layout;
 
 import java.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -14,6 +15,7 @@ import java.util.Set;
 import org.apache.log4j.Logger;
 
 import lcsb.mapviewer.commands.CommandExecutionException;
+import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.common.geometry.DoubleDimension;
@@ -40,6 +42,8 @@ import lcsb.mapviewer.model.map.reaction.type.TruncationReaction;
 import lcsb.mapviewer.model.map.species.Complex;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationResidue;
 
 public class ApplySimpleLayoutModelCommand extends ApplyLayoutModelCommand {
   /**
@@ -341,9 +345,84 @@ public class ApplySimpleLayoutModelCommand extends ApplyLayoutModelCommand {
         element.setX(elementCenterX - SPECIES_WIDTH / 2);
         element.setY(elementCenterY - SPECIES_HEIGHT / 2);
         index++;
+        if (element instanceof SpeciesWithModificationResidue) {
+          modifyElementModificationResiduesLocation((SpeciesWithModificationResidue) element);
+        }
+      }
+    }
+
+  }
+
+  private void modifyElementModificationResiduesLocation(SpeciesWithModificationResidue element) {
+    for (ModificationResidue mr : element.getModificationResidues()) {
+      List<Point2D> usedPoints = new ArrayList<>();
+      for (ModificationResidue inUseModification : element.getModificationResidues()) {
+        if (inUseModification.getPosition() != null) {
+          usedPoints.add(inUseModification.getPosition());
+        }
       }
+      mr.setPosition(findFarthestEmptyPositionOnRectangle(((Species) element).getBorder(), usedPoints));
     }
+  }
 
+  Point2D findFarthestEmptyPositionOnRectangle(Rectangle2D border, List<Point2D> usedPoints) {
+    // list of points reduced to one dimension
+    // every point is taking two position - so we can easier solve wrapping issues
+    List<Double> linearizedPoints = new ArrayList<>();
+    // there are two "guarding" points at the beginning and the end
+    linearizedPoints.add(0.0);
+    linearizedPoints.add(4 * (border.getWidth() + border.getHeight()));
+
+    for (Point2D point : usedPoints) {
+      Double linearizedPoint = null;
+      if (Math.abs(point.getY() - border.getMinY()) < Configuration.EPSILON) {
+        // upper edge
+        linearizedPoint = point.getX() - border.getMinX();
+      } else if (Math.abs(point.getX() - border.getMaxX()) < Configuration.EPSILON) {
+        // right edge
+        linearizedPoint = point.getY() - border.getMinY() + border.getWidth();
+      } else if (Math.abs(point.getY() - border.getMaxY()) < Configuration.EPSILON) {
+        // bottom edge
+        linearizedPoint = border.getMaxX() - point.getX() + border.getWidth() + border.getHeight();
+      } else if (Math.abs(point.getX() - border.getMinX()) < Configuration.EPSILON) {
+        // left edge
+        linearizedPoint = border.getMaxY() - point.getY() + border.getWidth() + border.getHeight() + border.getWidth();
+      } else {
+        logger.warn("Cannot align modification position on the species border");
+      }
+      linearizedPoints.add(linearizedPoint);
+      linearizedPoints.add(linearizedPoint + 2 * (border.getWidth() + border.getHeight()));
+
+    }
+    Collections.sort(linearizedPoints);
+
+    Double longest = linearizedPoints.get(1) - linearizedPoints.get(0);
+    Double position = (linearizedPoints.get(1) + linearizedPoints.get(0)) / 2;
+    for (int i = 1; i < linearizedPoints.size() - 1; i++) {
+      if (longest < linearizedPoints.get(i + 1) - linearizedPoints.get(i)) {
+        longest = linearizedPoints.get(i + 1) - linearizedPoints.get(i);
+        position = (linearizedPoints.get(i + 1) + linearizedPoints.get(i)) / 2;
+      }
+    }
+
+    if (position > 2 * (border.getWidth() + border.getHeight())) {
+      position -= 2 * (border.getWidth() + border.getHeight());
+    }
+
+    if (position < border.getWidth()) {
+      // upper edge
+      return new Point2D.Double(border.getMinX() + position, border.getMinY());
+    } else if (position < border.getWidth() + border.getHeight()) {
+      // right edge
+      return new Point2D.Double(border.getMaxX(), border.getMinY() + position - border.getWidth());
+    } else if (position < border.getWidth() + border.getHeight() + border.getWidth()) {
+      // bottom edge
+      return new Point2D.Double(border.getMinX() + position - border.getHeight() - border.getWidth(), border.getMaxY());
+    } else {
+      // left edge
+      return new Point2D.Double(border.getMinX(),
+          border.getMinY() + position - border.getWidth() - border.getHeight() - border.getWidth());
+    }
   }
 
   protected void modifyModelSize(Model model, Point2D minPoint, Dimension2D dimension) {
diff --git a/model-command/src/test/java/lcsb/mapviewer/commands/layout/ApplySimpleLayoutModelCommandTest.java b/model-command/src/test/java/lcsb/mapviewer/commands/layout/ApplySimpleLayoutModelCommandTest.java
index 4acc6bcc88e6ef41daa2d37e6f04068bfe1a0f31..8458345aabe3722f488e7e1e7f9383258cb900c5 100644
--- a/model-command/src/test/java/lcsb/mapviewer/commands/layout/ApplySimpleLayoutModelCommandTest.java
+++ b/model-command/src/test/java/lcsb/mapviewer/commands/layout/ApplySimpleLayoutModelCommandTest.java
@@ -7,7 +7,9 @@ import static org.junit.Assert.assertTrue;
 
 import java.awt.geom.Dimension2D;
 import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -26,6 +28,7 @@ import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.map.species.GenericProtein;
 import lcsb.mapviewer.model.map.species.Protein;
 import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.field.Residue;
 
 public class ApplySimpleLayoutModelCommandTest {
 
@@ -229,6 +232,38 @@ public class ApplySimpleLayoutModelCommandTest {
     assertTrue(p2.contains(p1));
   }
 
+  @Test
+  public void testModifyElementModificationResidueLocation() {
+    ApplySimpleLayoutModelCommand layoutModelCommand = new ApplySimpleLayoutModelCommand(null);
+    GenericProtein p1 = createProtein();
+    p1.addResidue(new Residue());
+    Set<Element> elements = new HashSet<>();
+    elements.add(p1);
+
+    layoutModelCommand.modifyElementLocation(elements, null, new Point2D.Double(100, 100),
+        new DoubleDimension(200, 200));
+
+    assertNotNull(p1.getModificationResidues().get(0).getPosition());
+  }
+
+  @Test
+  public void testModifyElementModificationResidueLocationWhenElementHasLayout() {
+    ApplySimpleLayoutModelCommand layoutModelCommand = new ApplySimpleLayoutModelCommand(null);
+    GenericProtein p1 = createProtein();
+    p1.setX(10);
+    p1.setY(10);
+    p1.setWidth(10);
+    p1.setHeight(10);
+    p1.addResidue(new Residue());
+    Set<Element> elements = new HashSet<>();
+    elements.add(p1);
+
+    layoutModelCommand.modifyElementLocation(elements, null, new Point2D.Double(100, 100),
+        new DoubleDimension(200, 200));
+
+    assertNotNull(p1.getModificationResidues().get(0).getPosition());
+  }
+
   @Test
   public void testModifyElementLocationInsideCompartmentInsideStaticCompartment() {
     ApplySimpleLayoutModelCommand layoutModelCommand = new ApplySimpleLayoutModelCommand(null);
@@ -262,4 +297,62 @@ public class ApplySimpleLayoutModelCommandTest {
     assertTrue(staticCompartment.contains(compartmentToLayout));
   }
 
+  @Test
+  public void testFindFarthestEmptyPositionOnRectangleWithEmptyPoints() {
+    ApplySimpleLayoutModelCommand layoutModelCommand = new ApplySimpleLayoutModelCommand(null);
+    Rectangle2D rect = new Rectangle2D.Double(10, 20, 100, 30);
+
+    assertNotNull(layoutModelCommand.findFarthestEmptyPositionOnRectangle(rect, new ArrayList<>()));
+  }
+
+  @Test
+  public void testFindFarthestEmptyPositionOnRectangleSinglePoint() {
+    ApplySimpleLayoutModelCommand layoutModelCommand = new ApplySimpleLayoutModelCommand(null);
+    Rectangle2D rect = new Rectangle2D.Double(10, 20, 100, 30);
+
+    List<Point2D> points = Arrays.asList(new Point2D[] { new Point2D.Double(55, rect.getMinY()) });
+    Point2D resultPoint = layoutModelCommand.findFarthestEmptyPositionOnRectangle(rect, points);
+    assertNotNull(resultPoint);
+    assertEquals("Expected point on lower edge", rect.getMaxY(), resultPoint.getY(), Configuration.EPSILON);
+
+    points = Arrays.asList(new Point2D[] { new Point2D.Double(55, rect.getMaxY()) });
+    resultPoint = layoutModelCommand.findFarthestEmptyPositionOnRectangle(rect, points);
+    assertNotNull(resultPoint);
+    assertEquals("Expected point on upper edge", rect.getMinY(), resultPoint.getY(), Configuration.EPSILON);
+
+    points = Arrays.asList(new Point2D[] { new Point2D.Double(rect.getMinX(), 35) });
+    resultPoint = layoutModelCommand.findFarthestEmptyPositionOnRectangle(rect, points);
+    assertNotNull(resultPoint);
+    assertEquals(rect.getMaxX(), resultPoint.getX(), Configuration.EPSILON);
+
+    points = Arrays.asList(new Point2D[] { new Point2D.Double(rect.getMaxX(), 35) });
+    resultPoint = layoutModelCommand.findFarthestEmptyPositionOnRectangle(rect, points);
+    assertNotNull(resultPoint);
+    assertEquals("Expected point on left edge", rect.getMinX(), resultPoint.getX(), Configuration.EPSILON);
+  }
+
+  @Test
+  public void testFindFarthestEmptyPositionOnRectangleWithTwoPoints() {
+    ApplySimpleLayoutModelCommand layoutModelCommand = new ApplySimpleLayoutModelCommand(null);
+    Rectangle2D rect = new Rectangle2D.Double(10, 20, 100, 30);
+
+    List<Point2D> points = Arrays
+        .asList(new Point2D[] { new Point2D.Double(55, rect.getMinY()), new Point2D.Double(55, rect.getMaxY()) });
+    Point2D resultPoint = layoutModelCommand.findFarthestEmptyPositionOnRectangle(rect, points);
+    assertNotNull(resultPoint);
+    assertFalse("Expected point shouldn't be on upper edge",
+        Math.abs(rect.getMinY() - resultPoint.getY()) < Configuration.EPSILON);
+    assertFalse("Expected point shouldn't be on lower edge",
+        Math.abs(rect.getMaxY() - resultPoint.getY()) < Configuration.EPSILON);
+
+    points = Arrays
+        .asList(new Point2D[] { new Point2D.Double(rect.getMinX(), 35), new Point2D.Double(rect.getMaxX(), 35) });
+    resultPoint = layoutModelCommand.findFarthestEmptyPositionOnRectangle(rect, points);
+    assertNotNull(resultPoint);
+    assertFalse("Expected point shouldn't be on left edge",
+        Math.abs(rect.getMinX() - resultPoint.getX()) < Configuration.EPSILON);
+    assertFalse("Expected point shouldn't be on right edge",
+        Math.abs(rect.getMaxX() - resultPoint.getX()) < Configuration.EPSILON);
+  }
+
 }
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/model/ModelData.java b/model/src/main/java/lcsb/mapviewer/model/map/model/ModelData.java
index 944387516ac51c92b9da59e829fd226106da8285..2e03cbf9b7eb341dcc586cad2336fdd4274ca041 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/model/ModelData.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/model/ModelData.java
@@ -150,7 +150,7 @@ public class ModelData implements Serializable {
    * Description of the map.
    */
   @Column(columnDefinition = "TEXT")
-  private String notes;
+  private String notes = "";
 
   /**
    * Name of the map.
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/AntisenseRna.java b/model/src/main/java/lcsb/mapviewer/model/map/species/AntisenseRna.java
index bf985706d3cbfd168ac9ea094c32415f6738b34d..2542862cca25535f64280ffeb3ae508525427011 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/AntisenseRna.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/AntisenseRna.java
@@ -1,6 +1,7 @@
 package lcsb.mapviewer.model.map.species;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.persistence.DiscriminatorValue;
@@ -13,7 +14,13 @@ import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
 import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithCodingRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationSite;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithProteinBindingDomain;
 
 /**
  * Entity representing antisense rna element on the map.
@@ -23,7 +30,8 @@ import lcsb.mapviewer.model.map.species.field.ModificationResidue;
  */
 @Entity
 @DiscriminatorValue("ANTISENSE_RNA")
-public class AntisenseRna extends Species {
+public class AntisenseRna extends Species
+    implements SpeciesWithCodingRegion, SpeciesWithModificationSite, SpeciesWithProteinBindingDomain {
 
   /**
    * 
@@ -54,7 +62,7 @@ public class AntisenseRna extends Species {
   public AntisenseRna(AntisenseRna original) {
     super(original);
     for (ModificationResidue region : original.getRegions()) {
-      addRegion(region.copy());
+      addModificationResidue(region.copy());
     }
   }
 
@@ -74,11 +82,26 @@ public class AntisenseRna extends Species {
    * @param antisenseRnaRegion
    *          region to be added
    */
-  public void addRegion(ModificationResidue antisenseRnaRegion) {
+  private void addModificationResidue(ModificationResidue antisenseRnaRegion) {
     regions.add(antisenseRnaRegion);
     antisenseRnaRegion.setSpecies(this);
   }
 
+  @Override
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+
+  @Override
+  public void addProteinBindingDomain(ProteinBindingDomain codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+
+  @Override
+  public void addModificationSite(ModificationSite codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+
   @Override
   public AntisenseRna copy() {
     if (this.getClass() == AntisenseRna.class) {
@@ -96,6 +119,11 @@ public class AntisenseRna extends Species {
     return regions;
   }
 
+  @Override
+  public Collection<ModificationResidue> getModificationResidues() {
+    return getRegions();
+  }
+
   /**
    * @param regions
    *          the regions to set
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Gene.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Gene.java
index 183c684ef1afb87ccc483765b80053b2eb7dd247..f27bfbc731d3124b950a6cd18974602f00eee819 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Gene.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Gene.java
@@ -7,13 +7,22 @@ import javax.persistence.DiscriminatorValue;
 import javax.persistence.Entity;
 import javax.persistence.OneToMany;
 
+import org.apache.log4j.Logger;
 import org.hibernate.annotations.Cascade;
 import org.hibernate.annotations.CascadeType;
 import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
 import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.RegulatoryRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithCodingRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationSite;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithRegulatoryRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithTranscriptionSite;
+import lcsb.mapviewer.model.map.species.field.TranscriptionSite;
 
 /**
  * Entity representing gene element on the map.
@@ -23,7 +32,10 @@ import lcsb.mapviewer.model.map.species.field.ModificationResidue;
  */
 @Entity
 @DiscriminatorValue("GENE")
-public class Gene extends Species {
+public class Gene extends Species implements SpeciesWithCodingRegion, SpeciesWithModificationSite, SpeciesWithRegulatoryRegion, SpeciesWithTranscriptionSite {
+  
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(Gene.class);
 
   /**
    * 
@@ -73,12 +85,32 @@ public class Gene extends Species {
    * @param modificationResidue
    *          {@link ModificationResidue} to be added
    */
-  public void addModificationResidue(ModificationResidue modificationResidue) {
+  private void addModificationResidue(ModificationResidue modificationResidue) {
     modificationResidues.add(modificationResidue);
     modificationResidue.setSpecies(this);
 
   }
 
+  @Override
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+
+  @Override
+  public void addModificationSite(ModificationSite modificationSite) {
+    this.addModificationResidue(modificationSite);
+  }
+
+  @Override
+  public void addRegulatoryRegion(RegulatoryRegion regulatoryRegion) {
+    this.addModificationResidue(regulatoryRegion);
+  }
+
+  @Override
+  public void addTranscriptionSite(TranscriptionSite transcriptionSite) {
+    this.addModificationResidue(transcriptionSite);
+  }
+
   @Override
   public Gene copy() {
     if (this.getClass() == Gene.class) {
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Protein.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Protein.java
index 829ca434832eff182470056c23b1f44c7e803dd6..31d26cd6090d9111348d334bb86ee104454621dd 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Protein.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Protein.java
@@ -12,7 +12,11 @@ import org.hibernate.annotations.CascadeType;
 import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
+import lcsb.mapviewer.model.map.species.field.BindingRegion;
 import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.Residue;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithBindingRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithResidue;
 
 /**
  * Entity representing protein element on the map.
@@ -22,7 +26,7 @@ import lcsb.mapviewer.model.map.species.field.ModificationResidue;
  */
 @Entity
 @DiscriminatorValue("PROTEIN")
-public abstract class Protein extends Species {
+public abstract class Protein extends Species implements SpeciesWithBindingRegion, SpeciesWithResidue {
 
   /**
    * 
@@ -78,11 +82,21 @@ public abstract class Protein extends Species {
    * @param modificationResidue
    *          modification to add
    */
-  public void addModificationResidue(ModificationResidue modificationResidue) {
+  private void addModificationResidue(ModificationResidue modificationResidue) {
     modificationResidues.add(modificationResidue);
     modificationResidue.setSpecies(this);
   }
 
+  @Override
+  public void addBindingRegion(BindingRegion bindingRegion) {
+    this.addModificationResidue(bindingRegion);
+  }
+
+  @Override
+  public void addResidue(Residue residue) {
+    this.addModificationResidue(residue);
+  }
+
   /**
    * @return the modificationResidues
    * @see #modificationResidues
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Rna.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Rna.java
index b9d6f9233ff13b29478c251c775de23a2c09b3c5..bed3ed07c3e1561c9480fcae09f8a4b839f46399 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Rna.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Rna.java
@@ -1,6 +1,7 @@
 package lcsb.mapviewer.model.map.species;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.persistence.DiscriminatorValue;
@@ -13,7 +14,13 @@ import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.map.species.field.CodingRegion;
 import lcsb.mapviewer.model.map.species.field.ModificationResidue;
+import lcsb.mapviewer.model.map.species.field.ModificationSite;
+import lcsb.mapviewer.model.map.species.field.ProteinBindingDomain;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithCodingRegion;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationSite;
+import lcsb.mapviewer.model.map.species.field.SpeciesWithProteinBindingDomain;
 
 /**
  * Entity representing rna element on the map.
@@ -23,7 +30,7 @@ import lcsb.mapviewer.model.map.species.field.ModificationResidue;
  */
 @Entity
 @DiscriminatorValue("RNA")
-public class Rna extends Species {
+public class Rna extends Species implements SpeciesWithCodingRegion, SpeciesWithProteinBindingDomain, SpeciesWithModificationSite {
 
   /**
    * 
@@ -53,7 +60,7 @@ public class Rna extends Species {
   public Rna(Rna original) {
     super(original);
     for (ModificationResidue region : original.getRegions()) {
-      addRegion(region.copy());
+      addModificationResidue(region.copy());
     }
   }
 
@@ -74,9 +81,24 @@ public class Rna extends Species {
    * @param rnaRegion
    *          object to be added
    */
-  public void addRegion(ModificationResidue rnaRegion) {
-    regions.add(rnaRegion);
-    rnaRegion.setSpecies(this);
+  private void addModificationResidue(ModificationResidue antisenseRnaRegion) {
+    regions.add(antisenseRnaRegion);
+    antisenseRnaRegion.setSpecies(this);
+  }
+
+  @Override
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  @Override
+  public void addProteinBindingDomain(ProteinBindingDomain codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  @Override
+  public void addModificationSite(ModificationSite codingRegion) {
+    this.addModificationResidue(codingRegion);
   }
 
   @Override
@@ -95,6 +117,11 @@ public class Rna extends Species {
   public List<ModificationResidue> getRegions() {
     return regions;
   }
+  
+  @Override
+  public Collection<ModificationResidue> getModificationResidues() {
+    return getRegions();
+  }
 
   /**
    * @param regions
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/AbstractSiteModification.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/AbstractSiteModification.java
index e1b7030a96809f6e15175f516571631b5b47ecf7..2f693653e6fdbca4b33b96d3888eace9403098ca 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/field/AbstractSiteModification.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/AbstractSiteModification.java
@@ -31,6 +31,10 @@ public abstract class AbstractSiteModification extends ModificationResidue {
     this.state = mr.getState();
   }
 
+  public AbstractSiteModification(String modificationId) {
+    super(modificationId);
+  }
+
   public ModificationState getState() {
     return state;
   }
@@ -42,8 +46,12 @@ public abstract class AbstractSiteModification extends ModificationResidue {
   @Override
   public String toString() {
     DecimalFormat format = new DecimalFormat("#.##");
-    String result = getName() + "," + getState() + ",Point2D[" + format.format(getPosition().getX()) + ","
-        + format.format(getPosition().getY()) + "]";
+    String positionString = "Point2D[null]";
+    if (getPosition() != null) {
+      positionString = "Point2D[" + format.format(getPosition().getX()) + "," + format.format(getPosition().getY())
+          + "]";
+    }
+    String result = getName() + "," + getState() + "," + positionString;
     return result;
   }
 
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/ModificationResidue.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/ModificationResidue.java
index 6d76f71c98a20f272d37727453f6d1f8c69b8fb0..4225d31fb3662e6756f63116111eeac72cf1ee23 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/field/ModificationResidue.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/ModificationResidue.java
@@ -92,6 +92,10 @@ public abstract class ModificationResidue implements Serializable {
     this.position = mr.position;
   }
 
+  public ModificationResidue(String modificationId) {
+    this.idModificationResidue = modificationId;
+  }
+
   /**
    * @return the idModificationResidue
    * @see #id
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/Residue.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/Residue.java
index d93cc8956d07f82c5b61648d481c9d6de4c20b25..c20e0606fb734b1422be9c5dafc701cedf1eb5be 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/field/Residue.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/Residue.java
@@ -29,6 +29,10 @@ public class Residue extends AbstractSiteModification {
     super(residue);
   }
 
+  public Residue(String modificationId) {
+    super(modificationId);
+  }
+
   /**
    * Creates copy of the object.
    * 
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithBindingRegion.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithBindingRegion.java
new file mode 100644
index 0000000000000000000000000000000000000000..0433dc213a2b11f732b71ea1630efcd49f44e8f8
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithBindingRegion.java
@@ -0,0 +1,20 @@
+package lcsb.mapviewer.model.map.species.field;
+
+/**
+ * Interface implemented by species that support {@link BindingRegion}
+ * modification.
+ * 
+ * @author Piotr Gawron
+ *
+ */
+public interface SpeciesWithBindingRegion extends SpeciesWithModificationResidue {
+
+  /**
+   * Adds a {@link BindingRegion} to the species.
+   * 
+   * @param bindingRegion
+   *          {@link BindingRegion} to add
+   */
+  void addBindingRegion(BindingRegion bindingRegion);
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithCodingRegion.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithCodingRegion.java
new file mode 100644
index 0000000000000000000000000000000000000000..2941294a8b814c33c3f433766d6becabf64ede06
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithCodingRegion.java
@@ -0,0 +1,20 @@
+package lcsb.mapviewer.model.map.species.field;
+
+/**
+ * Interface implemented by species that support {@link CodingRegion}
+ * modification.
+ * 
+ * @author Piotr Gawron
+ *
+ */
+public interface SpeciesWithCodingRegion extends SpeciesWithModificationResidue {
+
+  /**
+   * Adds a {@link CodingRegion} to the species.
+   * 
+   * @param codingRegion
+   *          {@link CodingRegion} to add
+   */
+  void addCodingRegion(CodingRegion codingRegion);
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithModificationResidue.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithModificationResidue.java
new file mode 100644
index 0000000000000000000000000000000000000000..692fa3e9566c9ffd75e7c0822d976ec17f42a2ee
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithModificationResidue.java
@@ -0,0 +1,15 @@
+package lcsb.mapviewer.model.map.species.field;
+
+import java.util.Collection;
+
+/**
+ * Interface implemented by species that support {@link ModificationResidue}.
+ * 
+ * @author Piotr Gawron
+ *
+ */
+public interface SpeciesWithModificationResidue {
+
+  Collection<ModificationResidue> getModificationResidues();
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithModificationSite.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithModificationSite.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cc929dde2a0988403dc873b54409d3c7f4214e4
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithModificationSite.java
@@ -0,0 +1,13 @@
+package lcsb.mapviewer.model.map.species.field;
+
+public interface SpeciesWithModificationSite extends SpeciesWithModificationResidue {
+
+  /**
+   * Adds a {@link ModificationSite } to the species.
+   * 
+   * @param codingRegion
+   *          {@link ModificationSite } to add
+   */
+  void addModificationSite (ModificationSite  modificationSite );
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithProteinBindingDomain.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithProteinBindingDomain.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef8c524ea7d5c3836ac2aa096f9e70ebb96217be
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithProteinBindingDomain.java
@@ -0,0 +1,13 @@
+package lcsb.mapviewer.model.map.species.field;
+
+public interface SpeciesWithProteinBindingDomain extends SpeciesWithModificationResidue {
+
+  /**
+   * Adds a {@link ProteinBindingDomain} to the species.
+   * 
+   * @param proteinBindingDomain
+   *          {@link ProteinBindingDomain} to add
+   */
+  void addProteinBindingDomain(ProteinBindingDomain proteinBindingDomain);
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithRegulatoryRegion.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithRegulatoryRegion.java
new file mode 100644
index 0000000000000000000000000000000000000000..cbb0526b68e8411584bd9e66ce8d4ddfa9a51bb4
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithRegulatoryRegion.java
@@ -0,0 +1,13 @@
+package lcsb.mapviewer.model.map.species.field;
+
+public interface SpeciesWithRegulatoryRegion extends SpeciesWithModificationResidue {
+
+  /**
+   * Adds a {@link RegulatoryRegion} to the species.
+   * 
+   * @param regulatoryRegion
+   *          {@link RegulatoryRegion} to add
+   */
+  void addRegulatoryRegion(RegulatoryRegion regulatoryRegion);
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithResidue.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithResidue.java
new file mode 100644
index 0000000000000000000000000000000000000000..46a1c305eea9db8d575e0beb685b4a8cf160e88c
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithResidue.java
@@ -0,0 +1,20 @@
+package lcsb.mapviewer.model.map.species.field;
+
+/**
+ * Interface implemented by species that support {@link Residue}
+ * modification.
+ * 
+ * @author Piotr Gawron
+ *
+ */
+public interface SpeciesWithResidue extends SpeciesWithModificationResidue {
+
+  /**
+   * Adds a {@link Residue} to the species.
+   * 
+   * @param residue
+   *          {@link Residue} to add
+   */
+  void addResidue(Residue residue);
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithTranscriptionSite.java b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithTranscriptionSite.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0f7c2ddce647e17b4688513286ca736ba22abf2
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/field/SpeciesWithTranscriptionSite.java
@@ -0,0 +1,13 @@
+package lcsb.mapviewer.model.map.species.field;
+
+public interface SpeciesWithTranscriptionSite extends SpeciesWithModificationResidue {
+
+  /**
+   * Adds a {@link TranscriptionSite} to the species.
+   * 
+   * @param transcriptionSite
+   *          {@link TranscriptionSite} to add
+   */
+  void addTranscriptionSite(TranscriptionSite transcriptionSite);
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/modelutils/map/ElementUtils.java b/model/src/main/java/lcsb/mapviewer/modelutils/map/ElementUtils.java
index 94777c846e43dc0a6bfa7ddac3d4dadeaccef60e..5313c5b44f9ddb33b98d4fc1981c46e7e9f43957 100644
--- a/model/src/main/java/lcsb/mapviewer/modelutils/map/ElementUtils.java
+++ b/model/src/main/java/lcsb/mapviewer/modelutils/map/ElementUtils.java
@@ -16,6 +16,7 @@ import lcsb.mapviewer.model.map.BioEntity;
 import lcsb.mapviewer.model.map.reaction.Reaction;
 import lcsb.mapviewer.model.map.reaction.ReactionNode;
 import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.species.field.ModificationResidue;
 
 /**
  * Class with some util method for {@link BioEntity} objects.
@@ -262,4 +263,9 @@ public final class ElementUtils {
     return "[" + node.getClass().getSimpleName() + "]" + getElementTag(node.getElement());
   }
 
+  public String getElementTag(ModificationResidue mr) {
+    return "[" + mr.getClass().getSimpleName() + "," + mr.getIdModificationResidue() + "]"
+        + getElementTag(mr.getSpecies());
+  }
+
 }
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaComparatorTest.java
index 3df395f239d1d3c67b2a4c19bad944711fc4dd03..858bc750babe6c6ce639b6f1165734a2c660d1d7 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaComparatorTest.java
@@ -79,7 +79,7 @@ public class AntisenseRnaComparatorTest {
     AntisenseRna result = new AntisenseRna();
 
     CodingRegion region1 = new CodingRegion();
-    result.addRegion(region1);
+    result.addCodingRegion(region1);
     region1.setIdModificationResidue("a");
     region1.setName("name");
     region1.setPosition(new Point2D.Double(0, 1));
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaTest.java
index f52284cd4f8e1d5ba73d85d9854e48c779c6c85b..102da4683c57e6641882cad666d0dc2b0ce0528c 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/AntisenseRnaTest.java
@@ -41,7 +41,7 @@ public class AntisenseRnaTest {
   public void testConstructor1() {
     try {
       AntisenseRna original = new AntisenseRna();
-      original.addRegion(new CodingRegion());
+      original.addCodingRegion(new CodingRegion());
       AntisenseRna aRna = new AntisenseRna(original);
       assertNotNull(aRna);
     } catch (Exception e) {
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/GeneComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/GeneComparatorTest.java
index e255b76e32b88358472f8baea183936de1a155e3..7b7d6d48694044e69cb299bedf6dd0663e3be914 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/GeneComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/GeneComparatorTest.java
@@ -82,13 +82,13 @@ public class GeneComparatorTest {
     Gene result = new Gene();
     result.setHypothetical(true);
 
-    AbstractSiteModification residue = new ModificationSite();
-    result.addModificationResidue(residue);
+    ModificationSite modificationSite = new ModificationSite();
+    result.addModificationSite(modificationSite);
 
-    residue.setIdModificationResidue("a");
-    residue.setName("name");
-    residue.setPosition(new Point2D.Double(10, 20));
-    residue.setState(ModificationState.ACETYLATED);
+    modificationSite.setIdModificationResidue("a");
+    modificationSite.setName("name");
+    modificationSite.setPosition(new Point2D.Double(10, 20));
+    modificationSite.setState(ModificationState.ACETYLATED);
     return result;
   }
 
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/GeneTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/GeneTest.java
index 5dd200337e5c9606ec99b7c20c0d4aca07f77c9d..f79e6affe717efea9677644296bddade33ea15df 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/GeneTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/GeneTest.java
@@ -41,7 +41,7 @@ public class GeneTest {
   public void testConstructor1() {
     try {
       Gene original = new Gene();
-      original.addModificationResidue(new ModificationSite());
+      original.addModificationSite(new ModificationSite());
       Gene gene = new Gene(original);
       assertNotNull(gene);
     } catch (Exception e) {
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/ProteinComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/ProteinComparatorTest.java
index e07e6d0e81ea684b57e326e9463dc66c13aed0b5..e0cdc967ea40aa88a95d268006c3985bce232c79 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/ProteinComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/ProteinComparatorTest.java
@@ -126,7 +126,7 @@ public class ProteinComparatorTest {
     result.setHypothetical(true);
 
     Residue residue = new Residue();
-    result.addModificationResidue(residue);
+    result.addResidue(residue);
 
     residue.setIdModificationResidue("a");
     residue.setName("name");
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/RnaComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/RnaComparatorTest.java
index 819c28ea1db97084f9080f6807500db4ae8227c2..f99156d913a2a5756672c1812cfb4505457773c2 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/RnaComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/RnaComparatorTest.java
@@ -81,7 +81,7 @@ public class RnaComparatorTest {
     result.setHypothetical(true);
 
     CodingRegion region1 = new CodingRegion();
-    result.addRegion(region1);
+    result.addCodingRegion(region1);
     region1.setIdModificationResidue("a");
     region1.setPosition(new Point2D.Double(0, 10));
     region1.setWidth(2.0);
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/RnaTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/RnaTest.java
index 948f46dcb1d15bb69d13a8cf2e4b2f08068e51e8..f36d79d0012bfcac3cd7404fed3656ddacf39f28 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/species/RnaTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/species/RnaTest.java
@@ -54,7 +54,7 @@ public class RnaTest {
   public void testConstructor() {
     try {
       Rna rna = new Rna("d");
-      rna.addRegion(new CodingRegion());
+      rna.addCodingRegion(new CodingRegion());
       Rna rna2 = new Rna(rna);
       assertEquals(rna.getRegions().size(), rna2.getRegions().size());
     } catch (Exception e) {
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
index f340ba5f5b221059b2bc5e756260f88d17fa5ff3..83d50098591ceecf2ee8dcd6a83012c3ce4ca521 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
@@ -390,10 +390,10 @@ public class ModelContructor {
 
         if (species instanceof Protein) {
           mr = new Residue();
-          ((Protein) species).addModificationResidue(mr);
+          ((Protein) species).addResidue((Residue) mr);
         } else if (species instanceof Gene) {
           mr = new ModificationSite();
-          ((Gene) species).addModificationResidue(mr);
+          ((Gene) species).addModificationSite((ModificationSite) mr);
         } else {
           logger.warn(
               state.getWarningPrefix() + "state for " + species.getClass().getSimpleName() + " is not supported.");
diff --git a/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20190102__remove_angle_from_modification.sql b/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20190102__remove_angle_from_modification.sql
new file mode 100644
index 0000000000000000000000000000000000000000..8f11a0a51ce38961daaa1e45ff594e3eca07d5f9
--- /dev/null
+++ b/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20190102__remove_angle_from_modification.sql
@@ -0,0 +1,2 @@
+-- rename arrowtypedata
+alter table modification_residue_table drop column angle;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java
index e00f0b9d3a59dd54fd112a61054a5dc23879a434..f44acde754fb9d737dfe59928134ee319654545c 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/CommentDaoTest.java
@@ -145,9 +145,9 @@ public class CommentDaoTest extends PersistTestFunctions {
     alias = createSpeciesAlias(264.8333333333335, 517.75, 86.0, 46.0, "pr1");
     model.addElement(alias);
 
-    ModificationResidue mr = new Residue();
+    Residue mr = new Residue();
     mr.setName("mr");
-    alias.addModificationResidue(mr);
+    alias.addResidue(mr);
 
     alias.addMiriamData(new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.CHEBI, "c"));
     return model;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/LayoutDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/LayoutDaoTest.java
index 406af683527f03ab81cf38ba5a72a08ee30c1361..d896472061e959ecabc6bfb5c47a10c8ede5ac31 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/LayoutDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/LayoutDaoTest.java
@@ -195,7 +195,7 @@ public class LayoutDaoTest extends PersistTestFunctions {
 
     Residue mr = new Residue();
     mr.setName("mr");
-    protein.addModificationResidue(mr);
+    protein.addResidue(mr);
 
     protein.addMiriamData(new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.CHEBI, "c"));
     return model;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
index 719167ffff6f29616d05b4e5f6f8ad4bd20897a6..400af2be98ef32b8b4ea09c08f3b52becacb25e2 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
@@ -424,7 +424,7 @@ public class ModelDaoTest extends PersistTestFunctions {
     Residue mr = new Residue();
     mr.setName("mr");
     mr.setPosition(new Point2D.Double(10, 20));
-    alias.addModificationResidue(mr);
+    alias.addResidue(mr);
 
     alias.addMiriamData(new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.CHEBI, "c"));
     return model;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AliasDaoTest2.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AliasDaoTest2.java
index abab8f1ff18ba61d06e5297769f517dd076474b0..08cfd58ce81c03717bd65ef57786e0a7c31e71b4 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AliasDaoTest2.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AliasDaoTest2.java
@@ -108,7 +108,7 @@ public class AliasDaoTest2 extends PersistTestFunctions {
       mr.setPosition(new Point2D.Double(10, 20));
       mr.setName("name");
       mr.setState(ModificationState.GLYCOSYLATED);
-      protein.addModificationResidue(mr);
+      protein.addResidue(mr);
 
       elementDao.add(protein);
 
@@ -143,7 +143,7 @@ public class AliasDaoTest2 extends PersistTestFunctions {
       ModificationSite mr = new ModificationSite();
       mr.setName("name");
       mr.setState(ModificationState.DONT_CARE);
-      sp.addRegion(mr);
+      sp.addModificationSite(mr);
 
       elementDao.add(sp);
       elementDao.evict(sp);
@@ -177,7 +177,7 @@ public class AliasDaoTest2 extends PersistTestFunctions {
       AntisenseRna sp = new AntisenseRna(testIdAlias);
       ModificationSite mr = new ModificationSite();
       mr.setName("name");
-      sp.addRegion(mr);
+      sp.addModificationSite(mr);
 
       elementDao.add(sp);
       elementDao.evict(sp);
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AntisenseRnaTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AntisenseRnaTest.java
index 44bb7dcec7e4cc03078389b86f2b6fcf2e4c5373..1b67cca4e98d1836e22aedfef5cbbd2fa0174713 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AntisenseRnaTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/AntisenseRnaTest.java
@@ -75,7 +75,7 @@ public class AntisenseRnaTest extends PersistTestFunctions {
     Model model = new ModelFullIndexed(null);
 
     AntisenseRna alias = new AntisenseRna("As");
-    alias.addRegion(new CodingRegion());
+    alias.addCodingRegion(new CodingRegion());
     alias.setX(1);
     alias.setY(2);
     alias.setWidth(10);
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/RnaTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/RnaTest.java
index 4eea1e67a969bfceb63b199381fe79e7d95e4464..d0392f51a0cd67c3f1f66cd4f4929e5890530306 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/RnaTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/layout/alias/RnaTest.java
@@ -74,7 +74,7 @@ public class RnaTest extends PersistTestFunctions {
     Model model = new ModelFullIndexed(null);
 
     Rna alias = new Rna("As");
-    alias.addRegion(new CodingRegion());
+    alias.addCodingRegion(new CodingRegion());
     alias.setX(1);
     alias.setY(2);
     alias.setWidth(10);
diff --git a/pom.xml b/pom.xml
index 28413ac14f095f02810c946ab04102bf15fdaa45..c6cbff9814714288b971db5f98a5802f5e44f3a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,6 +43,8 @@
 
 		<apache.commons-lang3.version>3.8.1</apache.commons-lang3.version>
 
+		<apache.commons-text.version>1.6</apache.commons-text.version>
+
 		<commons-cli.version>1.4</commons-cli.version>
 
 		<batik.version>1.10</batik.version>
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
index 61b7458f8ec4fbdf8f18ea7f8a400737aca97f5f..c9701d3a83d89132eb7e9c0a6122d2f4e3b7dbaf 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
@@ -117,7 +117,7 @@ public class ElementRestImplTest extends RestTestFunctions {
       Residue mr = new Residue();
       mr.setState(ModificationState.ACETYLATED);
       mr.setName("S250");
-      protein.addModificationResidue(mr);
+      protein.addResidue(mr);
       protein.setStructuralState(state);
       Map<String, Object> result = _elementsRestImpl.getOthersForElement(protein);
       assertNotNull(result.get("modifications"));
@@ -139,7 +139,7 @@ public class ElementRestImplTest extends RestTestFunctions {
       ModificationSite mr = new ModificationSite();
       mr.setState(ModificationState.ACETYLATED);
       mr.setName("S250");
-      rna.addRegion(mr);
+      rna.addModificationSite(mr);
       rna.setState(state);
       Map<String, Object> result = _elementsRestImpl.getOthersForElement(rna);
       assertNotNull(result.get("modifications"));
@@ -160,7 +160,7 @@ public class ElementRestImplTest extends RestTestFunctions {
       AntisenseRna antisenseRna = new AntisenseRna("s1");
       ModificationSite mr = new ModificationSite();
       mr.setName("S250");
-      antisenseRna.addRegion(mr);
+      antisenseRna.addModificationSite(mr);
       antisenseRna.setState(state);
       Map<String, Object> result = _elementsRestImpl.getOthersForElement(antisenseRna);
       assertNotNull(result.get("modifications"));