diff --git a/model/src/main/java/lcsb/mapviewer/model/map/Comment.java b/model/src/main/java/lcsb/mapviewer/model/map/Comment.java
index 8747682ed2c6b92c52969cf4b2e2a76ab5f3eebb..6bfd0f17db55b671a201861e6e9f324f561dc773 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/Comment.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/Comment.java
@@ -50,15 +50,9 @@ public class Comment implements Serializable {
   /**
    * The model that was commented.
    */
-  @ManyToOne(fetch = FetchType.LAZY)
+  @ManyToOne(fetch = FetchType.LAZY, optional=false)
   private ModelData model;
 
-  /**
-   * The model that was commented.
-   */
-  @ManyToOne(fetch = FetchType.LAZY)
-  private ModelData submodel;
-
   /**
    * User who gave the feedback (if logged in).
    */
@@ -314,38 +308,4 @@ public class Comment implements Serializable {
     this.model = model2;
   }
 
-  /**
-   * @return the submodel
-   * @see #submodel
-   */
-  public ModelData getSubmodelData() {
-    return submodel;
-  }
-
-  /**
-   * @param submodel
-   *          the submodel to set
-   * @see #submodel
-   */
-  public void setSubmodelData(ModelData submodel) {
-    this.submodel = submodel;
-  }
-
-  /**
-   * @return the submodel
-   * @see #submodel
-   */
-  public Model getSubmodel() {
-    return this.submodel.getModel();
-  }
-
-  /**
-   * @param submodel
-   *          the submodel to set
-   * @see #submodel
-   */
-  public void setSubmodel(Model submodel) {
-    this.submodel = submodel.getModelData();
-  }
-
 }
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/CommentTest.java b/model/src/test/java/lcsb/mapviewer/model/map/CommentTest.java
index b21e990c59062428a580d527b0aed0eac177d6db..5e4044e69d4e5ff96a41b2a2b0094e95538412ff 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/CommentTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/CommentTest.java
@@ -64,10 +64,6 @@ public class CommentTest extends ModelTestFunctions {
     assertEquals(pinned, comment.isPinned());
     comment.setRemoveReason(removeReason);
     assertEquals(removeReason, comment.getRemoveReason());
-    comment.setSubmodel(submodel);
-    assertEquals(submodel, comment.getSubmodel());
-    comment.setSubmodelData(submodel.getModelData());
-    assertEquals(submodel.getModelData(), comment.getSubmodelData());
     comment.setTableId(tableId);
     assertEquals(tableId, comment.getTableId());
     comment.setTableName(tableName);
diff --git a/persist/src/main/resources/db/migration/14.0.0~alpha.0/V14.0.0.20190725__comment_submodel_column_is_removed.sql b/persist/src/main/resources/db/migration/14.0.0~alpha.0/V14.0.0.20190725__comment_submodel_column_is_removed.sql
new file mode 100644
index 0000000000000000000000000000000000000000..25aa099906e0391bd144399080a5943902ffc554
--- /dev/null
+++ b/persist/src/main/resources/db/migration/14.0.0~alpha.0/V14.0.0.20190725__comment_submodel_column_is_removed.sql
@@ -0,0 +1,11 @@
+--remove submodel_id column 
+update comment_table set model_id = submodel_id where submodel_id is not null;
+ALTER TABLE comment_table drop COLUMN submodel_id;
+
+--comment must be attached to a model
+delete from comment_table where model_id is null;
+ALTER TABLE comment_table ALTER COLUMN model_id SET NOT NULL;
+
+-- pinned should be not null
+update comment_table set pinned = false where pinned is null;
+ALTER TABLE comment_table ALTER COLUMN pinned SET NOT NULL;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/graphics/PolylineDataTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/graphics/PolylineDataTest.java
index c483920daa3f78be2ec3f72e76343fe55a7a3d73..84914165c61694d8139e5fd56aaf7be8ba7efdd4 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/graphics/PolylineDataTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/graphics/PolylineDataTest.java
@@ -2,7 +2,7 @@ package lcsb.mapviewer.persist.dao.graphics;
 
 import static org.junit.Assert.*;
 
-import java.awt.*;
+import java.awt.Color;
 import java.awt.geom.Point2D;
 
 import org.junit.*;
@@ -26,40 +26,34 @@ public class PolylineDataTest extends PersistTestFunctions {
 
   @Test
   public void test() {
-    try {
-      PolylineData pd = new PolylineData();
-      pd.getBeginAtd().setArrowType(ArrowType.BLANK_CROSSBAR);
-      pd.getBeginAtd().setArrowLineType(LineType.DASHED);
-      pd.getBeginAtd().setLen(102);
-      pd.setColor(Color.CYAN);
-      pd.setType(LineType.SOLID_BOLD);
-      pd.setWidth(2);
-      pd.getPoints().add(new Point2D.Double(1, 1));
-      pd.getPoints().add(new Point2D.Double(2, 3));
-      pd.getPoints().add(new Point2D.Double(10, 11));
-      polylineDao.add(pd);
-      assertNotNull(pd.getId());
-      PolylineData pd2 = polylineDao.getById(pd.getId());
-      assertNotNull(pd2);
-
-      assertEquals(ArrowType.BLANK_CROSSBAR, pd2.getBeginAtd().getArrowType());
-      assertEquals(LineType.DASHED, pd2.getBeginAtd().getArrowLineType());
-      assertEquals(102, pd2.getBeginAtd().getLen(), EPSILON);
-      assertEquals(Color.CYAN, pd2.getColor());
-      assertEquals(LineType.SOLID_BOLD, pd2.getType());
-      assertEquals(2, pd2.getWidth(), EPSILON);
-      assertEquals(0, pd2.getPoints().get(0).distance(new Point2D.Double(1, 1)), EPSILON);
-      assertEquals(0, pd2.getPoints().get(1).distance(new Point2D.Double(2, 3)), EPSILON);
-      assertEquals(0, pd2.getPoints().get(2).distance(new Point2D.Double(10, 11)), EPSILON);
-
-      polylineDao.delete(pd);
-      pd2 = polylineDao.getById(pd.getId());
-      assertNull(pd2);
-
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    PolylineData pd = new PolylineData();
+    pd.getBeginAtd().setArrowType(ArrowType.BLANK_CROSSBAR);
+    pd.getBeginAtd().setArrowLineType(LineType.DASHED);
+    pd.getBeginAtd().setLen(102);
+    pd.setColor(Color.CYAN);
+    pd.setType(LineType.SOLID_BOLD);
+    pd.setWidth(2);
+    pd.getPoints().add(new Point2D.Double(1, 1));
+    pd.getPoints().add(new Point2D.Double(2, 3));
+    pd.getPoints().add(new Point2D.Double(10, 11));
+    polylineDao.add(pd);
+    assertNotNull(pd.getId());
+    PolylineData pd2 = polylineDao.getById(pd.getId());
+    assertNotNull(pd2);
+
+    assertEquals(ArrowType.BLANK_CROSSBAR, pd2.getBeginAtd().getArrowType());
+    assertEquals(LineType.DASHED, pd2.getBeginAtd().getArrowLineType());
+    assertEquals(102, pd2.getBeginAtd().getLen(), EPSILON);
+    assertEquals(Color.CYAN, pd2.getColor());
+    assertEquals(LineType.SOLID_BOLD, pd2.getType());
+    assertEquals(2, pd2.getWidth(), EPSILON);
+    assertEquals(0, pd2.getPoints().get(0).distance(new Point2D.Double(1, 1)), EPSILON);
+    assertEquals(0, pd2.getPoints().get(1).distance(new Point2D.Double(2, 3)), EPSILON);
+    assertEquals(0, pd2.getPoints().get(2).distance(new Point2D.Double(10, 11)), EPSILON);
+
+    polylineDao.delete(pd);
+    pd2 = polylineDao.getById(pd.getId());
+    assertNull(pd2);
   }
 
 }
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 4a0e19615c699f017b3d43bb797e028cc756c74a..1b4f4edd7efd4bac7e5320b19951a686128f547a 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
@@ -48,9 +48,15 @@ public class CommentDaoTest extends PersistTestFunctions {
 
   @Test
   public void testGetById() throws Exception {
+    Model model = createModel();
+    project.addModel(model);
+    modelDao.add(model);
+    projectDao.update(project);
+
     int counter = (int) commentDao.getCount();
     Comment comment = new Comment();
     comment.setUser(user);
+    comment.setModel(model);
     commentDao.add(comment);
     int counter2 = (int) commentDao.getCount();
     assertEquals(counter + 1, counter2);
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java
index 363cb67214134b3c0516f48ab2a93b5ba39be268..b7192d734458a67690ce1df71c59c22845b7a5a9 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java
@@ -38,298 +38,233 @@ public class UserDaoTest extends PersistTestFunctions {
 
   @Test
   public void testAddUpdateDelete() {
-    try {
-      User user = userDao.getUserByLogin(testLogin);
-      assertNull(user);
+    User user = userDao.getUserByLogin(testLogin);
+    assertNull(user);
 
-      long counter = userDao.getCount();
+    long counter = userDao.getCount();
 
-      user = new User();
-      user.setCryptedPassword("");
-      user.setLogin(testLogin);
-      user.addPrivilege(new Privilege(PrivilegeType.CAN_CREATE_OVERLAYS));
-      userDao.add(user);
+    user = new User();
+    user.setCryptedPassword("");
+    user.setLogin(testLogin);
+    user.addPrivilege(new Privilege(PrivilegeType.CAN_CREATE_OVERLAYS));
+    userDao.add(user);
 
-      long counter2 = userDao.getCount();
-      assertEquals(counter + 1, counter2);
+    long counter2 = userDao.getCount();
+    assertEquals(counter + 1, counter2);
 
-      user.setLogin(testLogin2);
-      userDao.update(user);
+    user.setLogin(testLogin2);
+    userDao.update(user);
 
-      User user2 = userDao.getUserByLogin(testLogin2);
-      assertNotNull(user2);
+    User user2 = userDao.getUserByLogin(testLogin2);
+    assertNotNull(user2);
 
-      userDao.delete(user);
+    userDao.delete(user);
 
-      user2 = userDao.getUserByLogin(testLogin2);
-      assertNull(user2);
-      counter2 = userDao.getCount();
-      assertEquals(counter, counter2);
-
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    user2 = userDao.getUserByLogin(testLogin2);
+    assertNull(user2);
+    counter2 = userDao.getCount();
+    assertEquals(counter, counter2);
   }
 
   @Test(expected = PropertyValueException.class)
   public void testTryUserWithNullPassword() {
-    try {
-      User user = new User();
-      user.setLogin(testLogin);
-      userDao.add(user);
-
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setLogin(testLogin);
+    userDao.add(user);
   }
 
   @Test(expected = PropertyValueException.class)
   public void testTryUserWithNullLogin() {
-    try {
-      User user = new User();
-      user.setCryptedPassword("ZX");
-      userDao.add(user);
-
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setCryptedPassword("ZX");
+    userDao.add(user);
   }
 
   @Test(expected = ConstraintViolationException.class)
   public void testTryUserWithExistingLogin() {
-    try {
-      User user = new User();
-      user.setLogin(testLogin);
-      user.setCryptedPassword("");
-      userDao.add(user);
-
-      User user2 = new User();
-      user2.setLogin(testLogin);
-      user2.setCryptedPassword("");
-      userDao.add(user2);
-
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setLogin(testLogin);
+    user.setCryptedPassword("");
+    userDao.add(user);
+
+    User user2 = new User();
+    user2.setLogin(testLogin);
+    user2.setCryptedPassword("");
+    userDao.add(user2);
   }
 
   @Test
   public void testAddDeleteAdd() {
-    try {
-      User user = userDao.getUserByLogin(testLogin);
-      assertNull(user);
-
-      long counter = userDao.getCount();
+    User user = userDao.getUserByLogin(testLogin);
+    assertNull(user);
 
-      user = new User();
-      user.setLogin(testLogin);
-      user.setCryptedPassword("");
-      userDao.add(user);
+    long counter = userDao.getCount();
 
-      long counter2 = userDao.getCount();
-      assertEquals(counter + 1, counter2);
+    user = new User();
+    user.setLogin(testLogin);
+    user.setCryptedPassword("");
+    userDao.add(user);
 
-      userDao.delete(user);
+    long counter2 = userDao.getCount();
+    assertEquals(counter + 1, counter2);
 
-      User user2 = userDao.getUserByLogin(testLogin);
-      assertNull(user2);
+    userDao.delete(user);
 
-      user2 = new User();
-      user2.setCryptedPassword("");
-      user2.setLogin(testLogin);
-      userDao.add(user2);
+    User user2 = userDao.getUserByLogin(testLogin);
+    assertNull(user2);
 
-      assertNotNull(userDao.getUserByLogin(testLogin));
+    user2 = new User();
+    user2.setCryptedPassword("");
+    user2.setLogin(testLogin);
+    userDao.add(user2);
 
-      userDao.delete(user2);
+    assertNotNull(userDao.getUserByLogin(testLogin));
 
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    userDao.delete(user2);
   }
 
   @Test
   public void testGetUserByLogin() throws Exception {
-    try {
-      User user = new User();
-      user.setCryptedPassword(testPasswd);
-      user.setLogin(testLogin);
-      userDao.add(user);
-      User user2 = userDao.getUserByLogin(testLogin);
-      assertNotNull(user2);
-      assertEquals(user2.getId(), user.getId());
-      assertEquals(user2.getLogin(), user.getLogin());
-      assertEquals(user2.getCryptedPassword(), user.getCryptedPassword());
-      user2 = userDao.getUserByLogin(testLogin2);
-      assertNull(user2);
-      userDao.delete(user);
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setCryptedPassword(testPasswd);
+    user.setLogin(testLogin);
+    userDao.add(user);
+    User user2 = userDao.getUserByLogin(testLogin);
+    assertNotNull(user2);
+    assertEquals(user2.getId(), user.getId());
+    assertEquals(user2.getLogin(), user.getLogin());
+    assertEquals(user2.getCryptedPassword(), user.getCryptedPassword());
+    user2 = userDao.getUserByLogin(testLogin2);
+    assertNull(user2);
+    userDao.delete(user);
   }
 
   @Test
   public void testGetUserByEmail() throws Exception {
-    try {
-      User user = new User();
-      user.setCryptedPassword(testPasswd);
-      user.setLogin(testLogin);
-      user.setEmail(testEmail);
-      user.addPrivilege(new Privilege(PrivilegeType.CAN_CREATE_OVERLAYS));
-      userDao.add(user);
-      User user2 = userDao.getUserByEmail(testEmail);
-      assertNotNull(user2);
-      assertEquals(user2.getId(), user.getId());
-      assertEquals(user2.getLogin(), user.getLogin());
-      assertEquals(user2.getCryptedPassword(), user.getCryptedPassword());
-      user2 = userDao.getUserByEmail(testEmail + "sadas");
-      assertNull(user2);
-      userDao.delete(user);
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setCryptedPassword(testPasswd);
+    user.setLogin(testLogin);
+    user.setEmail(testEmail);
+    user.addPrivilege(new Privilege(PrivilegeType.CAN_CREATE_OVERLAYS));
+    userDao.add(user);
+    User user2 = userDao.getUserByEmail(testEmail);
+    assertNotNull(user2);
+    assertEquals(user2.getId(), user.getId());
+    assertEquals(user2.getLogin(), user.getLogin());
+    assertEquals(user2.getCryptedPassword(), user.getCryptedPassword());
+    user2 = userDao.getUserByEmail(testEmail + "sadas");
+    assertNull(user2);
+    userDao.delete(user);
   }
 
   @Test
   public void testGetAll() throws Exception {
-    try {
-      assertTrue(userDao.getAll().size() > 0);
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    assertTrue(userDao.getAll().size() > 0);
   }
 
   @Test
   public void testUserWithAnnotatorSchema() throws Exception {
-    try {
-      User user = new User();
-      user.setLogin(testLogin);
-      user.setCryptedPassword("");
-      UserAnnotationSchema uas = new UserAnnotationSchema();
-      uas.setValidateMiriamTypes(true);
-      UserClassAnnotators ca = new UserClassAnnotators();
-      ca.setClassName(Species.class);
-      AnnotatorData annotatorData = new AnnotatorData(String.class);
-      ca.addAnnotator(annotatorData);
-      uas.addClassAnnotator(ca);
-      uas.addClassAnnotator(new UserClassAnnotators(String.class, new ArrayList<>()));
-      UserClassValidAnnotations cva = new UserClassValidAnnotations();
-      cva.setClassName(Reaction.class);
-      cva.addValidMiriamType(MiriamType.HGNC);
-      cva.addValidMiriamType(MiriamType.HGNC_SYMBOL);
-      uas.addClassValidAnnotations(cva);
-      uas.addClassValidAnnotations(new UserClassValidAnnotations(String.class, new ArrayList<>()));
-      uas.addClassValidAnnotations(new UserClassValidAnnotations(Integer.class, new ArrayList<>()));
-      user.setAnnotationSchema(uas);
-      userDao.add(user);
-      userDao.evict(user);
-      User user2 = userDao.getById(user.getId());
-      assertNotNull(user2);
-      UserAnnotationSchema uas2 = user2.getAnnotationSchema();
-      assertNotNull(uas2);
-      assertEquals(2, uas2.getClassAnnotators().size());
-      assertEquals(3, uas2.getClassValidAnnotators().size());
-      assertEquals(Species.class.getCanonicalName(), uas.getClassAnnotators().get(0).getClassName());
-      assertEquals(annotatorData, uas.getClassAnnotators().get(0).getAnnotators().get(0));
-      assertEquals(Reaction.class.getCanonicalName(), uas.getClassValidAnnotators().get(0).getClassName());
-      assertEquals(MiriamType.HGNC, uas.getClassValidAnnotators().get(0).getValidMiriamTypes().get(0));
-      assertEquals(MiriamType.HGNC_SYMBOL, uas.getClassValidAnnotators().get(0).getValidMiriamTypes().get(1));
-
-      userDao.delete(user2);
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setLogin(testLogin);
+    user.setCryptedPassword("");
+    UserAnnotationSchema uas = new UserAnnotationSchema();
+    uas.setValidateMiriamTypes(true);
+    UserClassAnnotators ca = new UserClassAnnotators();
+    ca.setClassName(Species.class);
+    AnnotatorData annotatorData = new AnnotatorData(String.class);
+    ca.addAnnotator(annotatorData);
+    uas.addClassAnnotator(ca);
+    uas.addClassAnnotator(new UserClassAnnotators(String.class, new ArrayList<>()));
+    UserClassValidAnnotations cva = new UserClassValidAnnotations();
+    cva.setClassName(Reaction.class);
+    cva.addValidMiriamType(MiriamType.HGNC);
+    cva.addValidMiriamType(MiriamType.HGNC_SYMBOL);
+    uas.addClassValidAnnotations(cva);
+    uas.addClassValidAnnotations(new UserClassValidAnnotations(String.class, new ArrayList<>()));
+    uas.addClassValidAnnotations(new UserClassValidAnnotations(Integer.class, new ArrayList<>()));
+    user.setAnnotationSchema(uas);
+    userDao.add(user);
+    userDao.evict(user);
+    User user2 = userDao.getById(user.getId());
+    assertNotNull(user2);
+    UserAnnotationSchema uas2 = user2.getAnnotationSchema();
+    assertNotNull(uas2);
+    assertEquals(2, uas2.getClassAnnotators().size());
+    assertEquals(3, uas2.getClassValidAnnotators().size());
+    assertEquals(Species.class.getCanonicalName(), uas.getClassAnnotators().get(0).getClassName());
+    assertEquals(annotatorData, uas.getClassAnnotators().get(0).getAnnotators().get(0));
+    assertEquals(Reaction.class.getCanonicalName(), uas.getClassValidAnnotators().get(0).getClassName());
+    assertEquals(MiriamType.HGNC, uas.getClassValidAnnotators().get(0).getValidMiriamTypes().get(0));
+    assertEquals(MiriamType.HGNC_SYMBOL, uas.getClassValidAnnotators().get(0).getValidMiriamTypes().get(1));
+
+    userDao.delete(user2);
   }
 
   @Test
   public void testUserWithAnnotatorSchemaGuiPreferences() throws Exception {
-    try {
-      User user = new User();
-      user.setLogin(testLogin);
-      user.setCryptedPassword("");
-      UserAnnotationSchema uas = new UserAnnotationSchema();
-      user.setAnnotationSchema(uas);
-      UserGuiPreference option = new UserGuiPreference();
-      option.setKey("key");
-      option.setValue("val");
-      uas.addGuiPreference(option);
-      userDao.add(user);
-      userDao.evict(user);
-      User user2 = userDao.getById(user.getId());
-      assertNotNull(user2);
-      UserAnnotationSchema uas2 = user2.getAnnotationSchema();
-      assertNotNull(uas2);
-      assertEquals(1, uas2.getGuiPreferences().size());
-
-      userDao.delete(user2);
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setLogin(testLogin);
+    user.setCryptedPassword("");
+    UserAnnotationSchema uas = new UserAnnotationSchema();
+    user.setAnnotationSchema(uas);
+    UserGuiPreference option = new UserGuiPreference();
+    option.setKey("key");
+    option.setValue("val");
+    uas.addGuiPreference(option);
+    userDao.add(user);
+    userDao.evict(user);
+    User user2 = userDao.getById(user.getId());
+    assertNotNull(user2);
+    UserAnnotationSchema uas2 = user2.getAnnotationSchema();
+    assertNotNull(uas2);
+    assertEquals(1, uas2.getGuiPreferences().size());
+
+    userDao.delete(user2);
   }
 
   @Test
   public void testUserWithAnnotatorSchemaRequiredAnnotations() throws Exception {
-    try {
-      User user = new User();
-      user.setLogin(testLogin);
-      user.setCryptedPassword("");
-      UserAnnotationSchema uas = new UserAnnotationSchema();
-      user.setAnnotationSchema(uas);
-      uas.addClassRequiredAnnotations(
-          new UserClassRequiredAnnotations(String.class, new MiriamType[] { MiriamType.WIKIPEDIA }));
-      userDao.add(user);
-      userDao.evict(user);
-      User user2 = userDao.getById(user.getId());
-      assertNotNull(user2);
-      UserAnnotationSchema uas2 = user2.getAnnotationSchema();
-      assertNotNull(uas2);
-      assertEquals(1, uas2.getClassRequiredAnnotators().size());
-
-      userDao.delete(user2);
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setLogin(testLogin);
+    user.setCryptedPassword("");
+    UserAnnotationSchema uas = new UserAnnotationSchema();
+    user.setAnnotationSchema(uas);
+    uas.addClassRequiredAnnotations(
+        new UserClassRequiredAnnotations(String.class, new MiriamType[] { MiriamType.WIKIPEDIA }));
+    userDao.add(user);
+    userDao.evict(user);
+    User user2 = userDao.getById(user.getId());
+    assertNotNull(user2);
+    UserAnnotationSchema uas2 = user2.getAnnotationSchema();
+    assertNotNull(uas2);
+    assertEquals(1, uas2.getClassRequiredAnnotators().size());
+
+    userDao.delete(user2);
   }
 
   @Test
   public void testUserWithAnnotatorParams() throws Exception {
-    try {
-      User user = new User();
-      user.setLogin(testLogin);
-      user.setCryptedPassword("");
-      UserAnnotationSchema uas = new UserAnnotationSchema();
-      user.setAnnotationSchema(uas);
-      UserClassAnnotators classAnnotators = new UserClassAnnotators(Integer.class);
-      AnnotatorData annotatorData = new AnnotatorData(String.class);
-      classAnnotators.addAnnotator(annotatorData);
-      uas.addClassAnnotator(classAnnotators);
-      AnnotatorConfigParameter param = new AnnotatorConfigParameter(AnnotatorParamDefinition.KEGG_ORGANISM_IDENTIFIER,
-          "val");
-      annotatorData.addAnnotatorParameter(param);
-      userDao.add(user);
-      userDao.evict(user);
-      User user2 = userDao.getById(user.getId());
-      assertNotNull(user2);
-      UserAnnotationSchema uas2 = user2.getAnnotationSchema();
-      assertNotNull(uas2);
-      assertEquals(1, uas2.getClassAnnotators().get(0).getAnnotators().get(0).getAnnotatorParams().size());
-
-      userDao.delete(user2);
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
+    User user = new User();
+    user.setLogin(testLogin);
+    user.setCryptedPassword("");
+    UserAnnotationSchema uas = new UserAnnotationSchema();
+    user.setAnnotationSchema(uas);
+    UserClassAnnotators classAnnotators = new UserClassAnnotators(Integer.class);
+    AnnotatorData annotatorData = new AnnotatorData(String.class);
+    classAnnotators.addAnnotator(annotatorData);
+    uas.addClassAnnotator(classAnnotators);
+    AnnotatorConfigParameter param = new AnnotatorConfigParameter(AnnotatorParamDefinition.KEGG_ORGANISM_IDENTIFIER,
+        "val");
+    annotatorData.addAnnotatorParameter(param);
+    userDao.add(user);
+    userDao.evict(user);
+    User user2 = userDao.getById(user.getId());
+    assertNotNull(user2);
+    UserAnnotationSchema uas2 = user2.getAnnotationSchema();
+    assertNotNull(uas2);
+    assertEquals(1, uas2.getClassAnnotators().get(0).getAnnotators().get(0).getAnnotatorParams().size());
+
+    userDao.delete(user2);
   }
 
 }
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/comments/CommentRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/comments/CommentRestImpl.java
index 5527253a14d4d328ddd33a5ac23ca4757427958a..24dad6f4343cf5e1313f677f2c9d2a25273f674f 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/comments/CommentRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/comments/CommentRestImpl.java
@@ -107,7 +107,7 @@ public class CommentRestImpl extends BaseRestImpl {
         value = getId(comment);
         break;
       case "modelid":
-        value = comment.getSubmodelData().getId();
+        value = comment.getModelData().getId();
         break;
       case "title":
         value = getTitle(comment);
@@ -279,7 +279,7 @@ public class CommentRestImpl extends BaseRestImpl {
       throw new QueryException("Unknown type of commented object: " + elementType);
     }
 
-    Comment comment = commentService.addComment(name, email, content, model, pointCoordinates, commentedObject, pinned,
+    Comment comment = commentService.addComment(name, email, content, pointCoordinates, commentedObject, pinned,
         submodel);
 
     return preparedComment(comment, createCommentColumnSet(""));
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/CommentService.java b/service/src/main/java/lcsb/mapviewer/services/impl/CommentService.java
index 3e4268803ee4c25d8277a52c199794bf7a2a5133..3d17c570b6c3293adcc11ada0f4f74552128433b 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/CommentService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/CommentService.java
@@ -12,13 +12,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import lcsb.mapviewer.common.ObjectUtils;
-import lcsb.mapviewer.common.exception.InvalidClassException;
 import lcsb.mapviewer.model.Project;
 import lcsb.mapviewer.model.map.Comment;
-import lcsb.mapviewer.model.map.model.Model;
-import lcsb.mapviewer.model.map.model.ModelData;
-import lcsb.mapviewer.model.map.reaction.Reaction;
-import lcsb.mapviewer.model.map.species.Element;
+import lcsb.mapviewer.model.map.model.*;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.persist.dao.map.CommentDao;
 import lcsb.mapviewer.services.interfaces.*;
@@ -79,35 +75,37 @@ public class CommentService implements ICommentService {
   }
 
   @Override
-  public Comment addComment(String name, String email, String content, Model model, Point2D coordinates, Object object,
+  public Comment addComment(String name, String email, String content, Point2D coordinates, Object object,
       boolean pinned, Model submodel) {
     Comment comment = new Comment();
     comment.setName(name);
     comment.setEmail(email);
     comment.setContent(content);
-    comment.setModel(model);
+    comment.setModel(submodel);
     comment.setCoordinates(coordinates);
     if (object != null) {
       comment.setTableName(object.getClass());
       comment.setTableId(ObjectUtils.getIdOfObject(object));
-      if (object instanceof Element) {
-        comment.setSubmodel(((Element) object).getModel());
-      } else if (object instanceof Reaction) {
-        comment.setSubmodel(((Reaction) object).getModel());
-      } else {
-        throw new InvalidClassException("Cannot comment on object of class: " + object.getClass());
-      }
-    } else {
-      comment.setSubmodel(submodel);
     }
     comment.setUser(null);
     comment.setPinned(pinned);
     commentDao.add(comment);
 
     try {
+      Project project = submodel.getProject();
+      if (project == null) {
+        for (SubmodelConnection sc : submodel.getParentModels()) {
+          if (sc instanceof ModelSubmodelConnection) {
+            project = ((ModelSubmodelConnection) sc).getParentModel().getModel().getProject();
+            if (project != null) {
+              break;
+            }
+          }
+        }
+      }
+
       EmailSender emailSender = new EmailSender(configurationService);
-      emailSender.sendEmail("New comment appeard in the " + model.getProject().getProjectId(), content,
-          model.getProject().getNotifyEmail());
+      emailSender.sendEmail("New comment appeard in the " + project.getProjectId(), content, project.getNotifyEmail());
     } catch (MessagingException e) {
       logger.error("Problem with sending email.", e);
     }
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
index 6d060e5578398e83dc55d225111990676a5acd1d..37f5050da1ccba7a7dafe49278fc3d518bd52777 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
@@ -75,24 +75,28 @@ public class UserService implements IUserService {
 
   @Override
   public void grantUserPrivilege(User user, PrivilegeType type) {
+    user = getUserByLogin(user.getLogin());
     user.addPrivilege(privilegeService.getPrivilege(type));
     userDao.update(user);
   }
 
   @Override
   public void grantUserPrivilege(User user, PrivilegeType type, String objectId) {
+    user = getUserByLogin(user.getLogin());
     user.addPrivilege(privilegeService.getPrivilege(type, objectId));
     userDao.update(user);
   }
 
   @Override
   public void revokeUserPrivilege(User user, PrivilegeType type) {
+    user = getUserByLogin(user.getLogin());
     user.removePrivilege(privilegeService.getPrivilege(type));
     userDao.update(user);
   }
 
   @Override
   public void revokeUserPrivilege(User user, PrivilegeType type, String objectId) {
+    user = getUserByLogin(user.getLogin());
     user.removePrivilege(privilegeService.getPrivilege(type, objectId));
     userDao.update(user);
   }
diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/ICommentService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/ICommentService.java
index 913e4340daa2c7dd827589b6c67b1af82d78a248..1f0b0ee31fc98c472294bde18566dad0c0a8c8d7 100644
--- a/service/src/main/java/lcsb/mapviewer/services/interfaces/ICommentService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/ICommentService.java
@@ -30,8 +30,6 @@ public interface ICommentService {
    *          email of the person that comments
    * @param content
    *          content of the comment
-   * @param model
-   *          which map we comment on
    * @param submodel
    *          on which submodel we comment on
    * @param coordinates
@@ -39,7 +37,7 @@ public interface ICommentService {
    * 
    * @return comment object created based on the data provided as parameters
    */
-  Comment addComment(String name, String email, String content, Model model, Point2D coordinates, Object object,
+  Comment addComment(String name, String email, String content, Point2D coordinates, Object object,
       boolean pinned, Model submodel);
 
   /**
diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java
index 2f5ba0faa2bdd1f03652d5844cbecdb91f837a07..af525309e8582bc2d4dc5f58c798b457c04f3be2 100644
--- a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java
+++ b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java
@@ -820,13 +820,28 @@ public class ColorSchemaReader {
       }
       String[] columns = line.split("\t");
       if (columns.length > 1) {
+        ColorSchemaType type = overlay.getColorSchemaType();
+        if (type == null) {
+          Map<String, String> params = TextFileUtils
+              .getHeaderParametersFromFile(new ByteArrayInputStream(overlay.getInputData().getFileContent()));
+          String typeString = params.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE);
+          if (typeString != null) {
+            type = ColorSchemaType.valueOf(typeString);
+          } else {
+            logger.warn("Undefined color schema type for overlay: " + overlay.getId());
+            type = ColorSchemaType.GENERIC;
+          }
+        }
 
         Map<ColorSchemaColumn, Integer> schemaColumns = new HashMap<>();
-        parseColumns(columns, schemaColumns, ColorSchemaType.GENERIC);
+        parseColumns(columns, schemaColumns, type);
         for (ColorSchemaColumn column : schemaColumns.keySet()) {
           try {
             Field f = ColorSchemaColumn.class.getField(column.name());
-            if (column.getDepractedColumnName() != null || f.isAnnotationPresent(Deprecated.class)) {
+            if (f.isAnnotationPresent(Deprecated.class)) {
+              result.add(column);
+            } else if (column.getDepractedColumnName() != null
+                && column.getDepractedColumnName().equalsIgnoreCase(columns[schemaColumns.get(column)])) {
               result.add(column);
             }
           } catch (NoSuchFieldException | SecurityException e) {
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/CommentServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/CommentServiceTest.java
index 83363c520ecde7089f58c73fc904db25dfae170d..0e3c1dfd79abe9fe3cd516720a170dbad8204da5 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/CommentServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/CommentServiceTest.java
@@ -62,16 +62,11 @@ public class CommentServiceTest extends ServiceTestFunctions {
 
   @Test
   public void testGetAgregatedComments() throws Exception {
-    commentService.addComment("John Doe", "a@a.pl", "Conteneta 1", model, new Point2D.Double(0, 1), alias, false,
-        model);
-    commentService.addComment("John Doe", "a@a.pl", "Contenetb 2", model, new Point2D.Double(0, 2), alias, false,
-        model);
-    commentService.addComment("John Doe", "a@a.pl", "Contenetc 3", model, new Point2D.Double(0, 3), alias2, false,
-        model);
-    commentService.addComment("John Doe", "a@a.pl", "Contenetc 4", model, new Point2D.Double(0, 4), null, false,
-        model);
-    commentService.addComment("John Doe", "a@a.pl", "Contenetc 5", model, new Point2D.Double(0, 5), null, false,
-        model);
+    commentService.addComment("John Doe", "a@a.pl", "Conteneta 1", new Point2D.Double(0, 1), alias, false, model);
+    commentService.addComment("John Doe", "a@a.pl", "Contenetb 2", new Point2D.Double(0, 2), alias, false, model);
+    commentService.addComment("John Doe", "a@a.pl", "Contenetc 3", new Point2D.Double(0, 3), alias2, false, model);
+    commentService.addComment("John Doe", "a@a.pl", "Contenetc 4", new Point2D.Double(0, 4), null, false, model);
+    commentService.addComment("John Doe", "a@a.pl", "Contenetc 5", new Point2D.Double(0, 5), null, false, model);
     CommentService service = new CommentService(null, null, null, null);
     service.setCommentDao(commentDao);
     List<List<Comment>> comments = service.getAgregatedComments(model, null);
@@ -92,7 +87,7 @@ public class CommentServiceTest extends ServiceTestFunctions {
   @Test
   public void testAddComment() throws Exception {
     long counter = commentService.getCommentCount();
-    Comment feedback = commentService.addComment("a", "b", "c", model, new Point2D.Double(0, 0), null, false, model);
+    Comment feedback = commentService.addComment("a", "b", "c", new Point2D.Double(0, 0), null, false, model);
     long counter2 = commentService.getCommentCount();
     assertEquals(counter + 1, counter2);
     commentDao.delete(feedback);
@@ -101,7 +96,7 @@ public class CommentServiceTest extends ServiceTestFunctions {
   @Test
   public void testAddCommentForReaction() throws Exception {
     long counter = commentService.getCommentCount();
-    Comment feedback = commentService.addComment("a", "b", "c", model, new Point2D.Double(0, 0),
+    Comment feedback = commentService.addComment("a", "b", "c", new Point2D.Double(0, 0),
         model.getReactions().iterator().next(), false, model);
     long counter2 = commentService.getCommentCount();
     assertEquals(counter + 1, counter2);
@@ -112,7 +107,7 @@ public class CommentServiceTest extends ServiceTestFunctions {
   public void testAddCommentForAlias() throws Exception {
     Element alias = model.getElementByElementId("sa1");
     long counter = commentService.getCommentCount();
-    Comment feedback = commentService.addComment("a", "b", "c", model, new Point2D.Double(0, 0), alias, false, model);
+    Comment feedback = commentService.addComment("a", "b", "c", new Point2D.Double(0, 0), alias, false, model);
     long counter2 = commentService.getCommentCount();
     assertEquals(counter + 1, counter2);
     commentDao.delete(feedback);
diff --git a/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java b/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java
index f58cdd4923d1c5f3925ef44e0e9d83d14ae58f22..e97c9420f00cd4570dca48c15b4cc2777135d124 100644
--- a/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java
@@ -15,12 +15,14 @@ import org.junit.*;
 import lcsb.mapviewer.commands.ColorExtractor;
 import lcsb.mapviewer.commands.ColorModelCommand;
 import lcsb.mapviewer.common.TextFileUtils;
+import lcsb.mapviewer.converter.zip.ZipEntryFileFactory;
 import lcsb.mapviewer.model.cache.UploadedFileEntry;
 import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.model.map.layout.*;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.services.ServiceTestFunctions;
+import lcsb.mapviewer.services.utils.data.ColorSchemaColumn;
 
 public class ColorSchemaReaderTest extends ServiceTestFunctions {
   Logger logger = LogManager.getLogger(ColorSchemaReaderTest.class);
@@ -334,4 +336,35 @@ public class ColorSchemaReaderTest extends ServiceTestFunctions {
     overlay.setInputData(file);
     assertEquals(0, reader.getDeprecatedColumns(overlay).size());
   }
+
+  @Test
+  public void testGetDeprecatedColumnsForValidGeneticColumns() throws Exception {
+    Layout overlay = new Layout();
+    overlay.setColorSchemaType(ColorSchemaType.GENETIC_VARIANT);
+    UploadedFileEntry file = new UploadedFileEntry();
+    file.setFileContent((ColorSchemaColumn.POSITION.name() + "\tgene_name\n").getBytes("UTF-8"));
+    overlay.setInputData(file);
+    assertEquals(0, reader.getDeprecatedColumns(overlay).size());
+  }
+
+  @Test
+  public void testGetDeprecatedColumnsForDeprecatedGeneticColumns() throws Exception {
+    Layout overlay = new Layout();
+    overlay.setColorSchemaType(ColorSchemaType.GENETIC_VARIANT);
+    UploadedFileEntry file = new UploadedFileEntry();
+    file.setFileContent((ColorSchemaColumn.POSITION.name() + "\tname\n").getBytes("UTF-8"));
+    overlay.setInputData(file);
+    assertEquals(1, reader.getDeprecatedColumns(overlay).size());
+  }
+
+  @Test
+  public void testGetDeprecatedColumnsForOverlayWithHeader() throws Exception {
+    Layout overlay = new Layout();
+    UploadedFileEntry file = new UploadedFileEntry();
+    String content = "#" + ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE + "=" + ColorSchemaType.GENERIC + "\n" +
+        ColorSchemaColumn.VALUE.name() + "\tname\n";
+    file.setFileContent((content).getBytes("UTF-8"));
+    overlay.setInputData(file);
+    assertEquals(0, reader.getDeprecatedColumns(overlay).size());
+  }
 }
diff --git a/web/src/test/java/lcsb/mapviewer/web/AllIntegrationTests.java b/web/src/test/java/lcsb/mapviewer/web/AllIntegrationTests.java
index 432add8ee7a07f2b3cb912dcc9ba3ffbb8b6727c..a7e43f53026a8724d59ac18b4d12f88e60a7a0b6 100644
--- a/web/src/test/java/lcsb/mapviewer/web/AllIntegrationTests.java
+++ b/web/src/test/java/lcsb/mapviewer/web/AllIntegrationTests.java
@@ -20,6 +20,7 @@ import org.junit.runners.Suite.SuiteClasses;
     PluginControllerIntegrationTest.class,
     ProjectControllerIntegrationTest.class,
     ProjectControllerIntegrationTestForAsyncCalls.class,
+    ProjectControllerIntegrationTestWithoutTransaction.class,
     PublicationsControllerIntegrationTest.class,
     ReactionControllerIntegrationTest.class,
     SpringSecurityGeneralIntegrationTest.class,
diff --git a/web/src/test/java/lcsb/mapviewer/web/CommentControllerIntegrationTest.java b/web/src/test/java/lcsb/mapviewer/web/CommentControllerIntegrationTest.java
index 1fb757ca94e00f52aea0065947afaafe84e7c276..50e40f3869a52fd8077280bb9780cd711272dd0b 100644
--- a/web/src/test/java/lcsb/mapviewer/web/CommentControllerIntegrationTest.java
+++ b/web/src/test/java/lcsb/mapviewer/web/CommentControllerIntegrationTest.java
@@ -702,7 +702,6 @@ public class CommentControllerIntegrationTest extends ControllerIntegrationTest
 
   private Comment createComment() {
     Comment comment = new Comment();
-    comment.setSubmodelData(map);
     comment.setModel(map);
     comment.setCoordinates(new Point2D.Double(10, 20));
     return comment;
diff --git a/web/src/test/java/lcsb/mapviewer/web/ControllerIntegrationTest.java b/web/src/test/java/lcsb/mapviewer/web/ControllerIntegrationTest.java
index df0d467a514896a88b06580bb23adf5e97f8df7c..769bfcf888e2a142499d003977ee61c13db8fa77 100644
--- a/web/src/test/java/lcsb/mapviewer/web/ControllerIntegrationTest.java
+++ b/web/src/test/java/lcsb/mapviewer/web/ControllerIntegrationTest.java
@@ -27,6 +27,7 @@ import org.springframework.web.context.WebApplicationContext;
 import lcsb.mapviewer.common.MinervaLoggerAppender;
 import lcsb.mapviewer.common.UnitTestFailedWatcher;
 import lcsb.mapviewer.model.Project;
+import lcsb.mapviewer.model.ProjectStatus;
 import lcsb.mapviewer.model.cache.UploadedFileEntry;
 import lcsb.mapviewer.model.graphics.PolylineData;
 import lcsb.mapviewer.model.map.model.ModelData;
@@ -232,4 +233,33 @@ abstract public class ControllerIntegrationTest {
     });
   }
 
+  protected UploadedFileEntry createFileInSeparateThread(String content, User user) throws Exception {
+    return callInSeparateThread(() -> {
+      return createFile(content, user);
+    });
+  }
+
+  protected void waitForProjectToFinishLoading(String projectId) throws InterruptedException {
+    Project project;
+    do {
+      project = projectDao.getProjectByProjectId(projectId);
+      projectDao.evict(project);
+      Thread.sleep(100);
+    } while (project.getStatus() != ProjectStatus.DONE);
+  }
+
+  public void removeProjectInSeparateThread(Project project) throws Exception {
+    removeProjectInSeparateThread(project.getProjectId());
+  }
+
+  public void removeProjectInSeparateThread(String projectId) throws Exception {
+    callInSeparateThread(() -> {
+      Project project = projectDao.getProjectByProjectId(projectId);
+      if (project != null) {
+        projectDao.delete(project);
+      }
+      return null;
+    });
+  }
+
 }
diff --git a/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestForAsyncCalls.java b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestForAsyncCalls.java
index 607a27e11b64605c7fe5d89ddb0815f0d18219cb..c779a724e2f144891caba5b6aac1747e5c60cfc0 100644
--- a/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestForAsyncCalls.java
+++ b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestForAsyncCalls.java
@@ -101,15 +101,6 @@ public class ProjectControllerIntegrationTestForAsyncCalls extends ControllerInt
     }
   }
 
-  private void waitForProjectToFinishLoading(String projectId) throws InterruptedException {
-    Project project;
-    do {
-      project = projectDao.getProjectByProjectId(projectId);
-      projectDao.evict(project);
-      Thread.sleep(100);
-    } while (project.getStatus() != ProjectStatus.DONE);
-  }
-
   private void waitForProjectToFinishRemoving(String projectId) throws InterruptedException {
     Project project;
     do {
@@ -377,11 +368,6 @@ public class ProjectControllerIntegrationTestForAsyncCalls extends ControllerInt
     }
   }
 
-  private UploadedFileEntry createFileInSeparateThread(String content, User user) throws Exception {
-    return callInSeparateThread(() -> {
-      return createFile(content, user);
-    });
-  }
 
   private User createCuratorInSeparateThread(String login, String password) throws Exception {
     return callInSeparateThread(() -> {
@@ -401,18 +387,4 @@ public class ProjectControllerIntegrationTestForAsyncCalls extends ControllerInt
     });
   }
 
-  private void removeProjectInSeparateThread(Project project) throws Exception {
-    removeProjectInSeparateThread(project.getProjectId());
-  }
-
-  private void removeProjectInSeparateThread(String projectId) throws Exception {
-    callInSeparateThread(() -> {
-      Project project = projectDao.getProjectByProjectId(projectId);
-      if (project != null) {
-        projectDao.delete(project);
-      }
-      return null;
-    });
-  }
-
 }
diff --git a/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1f33cbaa925c2109e3bba25c974a688a5d8518f
--- /dev/null
+++ b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java
@@ -0,0 +1,77 @@
+package lcsb.mapviewer.web;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.web.servlet.RequestBuilder;
+
+import lcsb.mapviewer.model.cache.UploadedFileEntry;
+import lcsb.mapviewer.model.user.User;
+import lcsb.mapviewer.services.interfaces.IUserService;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+public class ProjectControllerIntegrationTestWithoutTransaction extends ControllerIntegrationTest {
+
+  private static final String BUILT_IN_ADMIN_PASSWORD = "admin";
+  private static final String BUILT_IN_ADMIN_LOGIN = "admin";
+
+  private static final String TEST_PROJECT = "test_project";
+
+  Logger logger = LogManager.getLogger();
+  @Autowired
+  private IUserService userService;
+
+  @Before
+  public void setup() {
+  }
+
+  @Test
+  public void addProjectAsCurator() throws Exception {
+    User admin = userService.getUserByLogin(BUILT_IN_ADMIN_LOGIN);
+    try {
+      UploadedFileEntry fileEntry = createFileInSeparateThread(
+          new String(Files.readAllBytes(Paths.get("./src/test/resources/generic.xml")), "UTF-8"),
+          admin);
+
+      String body = EntityUtils.toString(new UrlEncodedFormEntity(Arrays.asList(
+          new BasicNameValuePair("file-id", String.valueOf(fileEntry.getId())),
+          new BasicNameValuePair("mapCanvasType", "OPEN_LAYERS"),
+          new BasicNameValuePair("parser",
+              "lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser"))));
+
+      RequestBuilder request = post("/projects/" + TEST_PROJECT)
+          .contentType(MediaType.APPLICATION_FORM_URLENCODED)
+          .content(body)
+          .session(createSession(BUILT_IN_ADMIN_LOGIN, BUILT_IN_ADMIN_PASSWORD));
+
+      mockMvc.perform(request).andExpect(status().is2xxSuccessful());
+
+    } finally {
+      callInSeparateThread(()->{
+        try {
+          waitForProjectToFinishLoading(TEST_PROJECT);
+        } catch (InterruptedException e) {
+          e.printStackTrace();
+        }
+        return null;
+      });
+      removeProjectInSeparateThread(TEST_PROJECT);
+    }
+  }
+
+}