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..1e2809aa350f54a8dfca6c68eb9382bc7b34a43b 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,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.AntisenseRna;
 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 +145,18 @@ public class CellDesignerAntisenseRna extends CellDesignerSpecies<AntisenseRna>
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(AntisenseRna antisenseRna) {
     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/CellDesignerGene.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/structure/CellDesignerGene.java
index 247887c598d8437f530e4c81b3fe885603c8975f..cd8e8ee223911038c8461483c443a1c0aa9f84ea 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,16 @@ package lcsb.mapviewer.converter.model.celldesigner.structure;
 import java.util.ArrayList;
 import java.util.List;
 
+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}.
@@ -113,10 +119,20 @@ public class CellDesignerGene extends CellDesignerSpecies<Gene> {
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(Gene gene) {
     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..d82a2060b31e98fe1fa975d068ba8fc9b430be7b 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,13 @@ 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 +153,16 @@ 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(Protein element) {
+    for (CellDesignerModificationResidue region : modificationResidues) {
+      ModificationResidue mr = region.createModificationResidue(element);
+      if (mr instanceof Residue) {
+        element.addResidue((Residue) mr);
+      } else if (mr instanceof BindingRegion) {
+        element.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..1e2406c3749e6975c91a2732429e2cc63b783770 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,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.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 +143,18 @@ public class CellDesignerRna extends CellDesignerSpecies<Rna> {
   }
 
   @Override
-  public void updateModelElementAfterLayoutAdded(Species element) {
+  public void updateModelElementAfterLayoutAdded(Rna rna) {
     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/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/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/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java
index 1ae127b7232fa28a355a30495106efd534d3fe00..cffe83e9340a9cbbbf15bd7a40d84a99147e78e9 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
@@ -50,7 +50,9 @@ import lcsb.mapviewer.model.map.species.IonChannelProtein;
 import lcsb.mapviewer.model.map.species.ReceptorProtein;
 import lcsb.mapviewer.model.map.species.Species;
 import lcsb.mapviewer.model.map.species.TruncatedProtein;
+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);
@@ -606,4 +608,33 @@ public class SbmlExporterTest {
         speciesExtension.getListOfSpeciesFeatures().size() > 0);
   }
 
+  @Test
+  public void testExportResidue() throws Exception {
+    Model model = createEmptyModel();
+    GenericProtein element = new GenericProtein("id");
+    element.setName("test name");
+    element.setX(10);
+    element.setWidth(10);
+    element.setY(10);
+    element.setHeight(10);
+    Residue mr = new Residue("x1");
+    mr.setName("217U");
+    mr.setState(ModificationState.PHOSPHORYLATED);
+    element.addResidue(mr);
+    mr = new Residue("Y");
+    mr.setName("218");
+    mr.setState(ModificationState.PHOSPHORYLATED);
+    element.addResidue(mr);
+    mr = new Residue("Z");
+    mr.setName("219");
+    mr.setState(ModificationState.UBIQUITINATED);
+    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());
+
+  }
+
 }
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..416802d7dbd4da2eb52429b2150373cd62a80546 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
@@ -13,7 +13,10 @@ 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;
 
 /**
  * Entity representing antisense rna element on the map.
@@ -38,7 +41,7 @@ public class AntisenseRna extends Species {
   @OneToMany(mappedBy = "species")
   @LazyCollection(LazyCollectionOption.FALSE)
   private List<ModificationResidue> regions = new ArrayList<>();
-
+  
   /**
    * Empty constructor required by hibernate.
    */
@@ -54,7 +57,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 +77,23 @@ 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);
   }
-
+  
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  public void addProteinBindingDomain(ProteinBindingDomain codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  public void addModificationSite(ModificationSite codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
   @Override
   public AntisenseRna copy() {
     if (this.getClass() == AntisenseRna.class) {
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..9c87b44c786016db7b99361ce2ddf4ad03935749 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
@@ -13,7 +13,11 @@ 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.TranscriptionSite;
 
 /**
  * Entity representing gene element on the map.
@@ -73,12 +77,28 @@ 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);
 
   }
 
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+
+  public void addModificationSite(ModificationSite modificationSite) {
+    this.addModificationResidue(modificationSite);
+  }
+
+  public void addRegulatoryRegion(RegulatoryRegion regulatoryRegion) {
+    this.addModificationResidue(regulatoryRegion);
+  }
+
+  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..9a52c460318cf04c6c0bbba8dc2298c20c130bc6 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,9 @@ 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;
 
 /**
  * Entity representing protein element on the map.
@@ -41,7 +43,7 @@ public abstract class Protein extends Species {
   @OneToMany(mappedBy = "species", orphanRemoval = true)
   @LazyCollection(LazyCollectionOption.FALSE)
   private List<ModificationResidue> modificationResidues = new ArrayList<>();
-
+  
   /**
    * Empty constructor required by hibernate.
    */
@@ -78,11 +80,19 @@ 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);
   }
 
+  public void addBindingRegion(BindingRegion bindingRegion) {
+    this.addModificationResidue(bindingRegion);
+  }
+
+  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..cbaedd90b4445cb0345df4950679ca5dbfe3541e 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
@@ -13,7 +13,10 @@ 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;
 
 /**
  * Entity representing rna element on the map.
@@ -53,7 +56,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 +77,21 @@ 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);
+  }
+  
+  public void addCodingRegion(CodingRegion codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  public void addProteinBindingDomain(ProteinBindingDomain codingRegion) {
+    this.addModificationResidue(codingRegion);
+  }
+  
+  public void addModificationSite(ModificationSite codingRegion) {
+    this.addModificationResidue(codingRegion);
   }
 
   @Override
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..86ef4c8d196bba7cfdf6fb528323854152ee7aa4 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;
   }
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/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/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/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"));