diff --git a/mozen/src/main/java/mozen/business/IModelManager.java b/mozen/src/main/java/mozen/business/IModelManager.java
index 7607daad2fdae48c3b427d381ceb031e556c3f5c..7d6d2ffc4abc51e750750320b6ac59c2d7ec98dd 100644
--- a/mozen/src/main/java/mozen/business/IModelManager.java
+++ b/mozen/src/main/java/mozen/business/IModelManager.java
@@ -21,7 +21,7 @@ public interface IModelManager {
   void removeLayer(long id, User user) throws Exception;
 
   void addFile(MultipartFile file, long id, User user) throws Exception;
-  void addLayerFile(MultipartFile file, long id, User user) throws Exception;
+  void addLayerFile(MultipartFile file, long modelId, String name, User user) throws Exception;
 
   void addTag(TagMessage message);
 
diff --git a/mozen/src/main/java/mozen/business/ModelManager.java b/mozen/src/main/java/mozen/business/ModelManager.java
index e992894fd4a998d0280f6edea45ae9ad238b8171..938034e832288dfd6bdbaefa1d67ec5f6ed5f7a3 100644
--- a/mozen/src/main/java/mozen/business/ModelManager.java
+++ b/mozen/src/main/java/mozen/business/ModelManager.java
@@ -33,43 +33,27 @@ public class ModelManager implements IModelManager {
     model.setShortDescription(message.getShortDescription());
     model.setLongDescription(message.getLongDescription());
 
-    System.err.println("[MODEL MANAGER] oui 2");
+    System.err.println("[MODEL MANAGER] add model 2");
 
     if (message.getTags() != null) {
-      System.err.println("[MODEL MANAGER] oui 2.1");
+      System.err.println("[MODEL MANAGER] add model new tag 2.1");
       Set<Tag> tags = new HashSet<Tag>();
       for (String tagName : message.getTags()) {
         Tag tag = dao.getTagByName(tagName);
         tags.add(tag);
       }
-      System.err.println("[MODEL MANAGER] oui 2.2");
+      System.err.println("[MODEL MANAGER] add model new tag 2.2");
       model.setTags(tags);
     } 
 
-    System.err.println("[MODEL MANAGER] oui 3");
-
-    if (message.getCustomLayers() != null) {
-      System.err.println("[MODEL MANAGER] oui 3.1");
-      Set<CustomLayer> layers = new HashSet<CustomLayer>();
-      for (String layerName : message.getCustomLayers()) {
-        System.err.println("[MODEL MANAGER] new layer 1"+layerName);
-        CustomLayer layer = new CustomLayer();
-        layer.setName(layerName);
-        System.err.println("[MODEL MANAGER] new layer 2"+layerName);
-        layers.add(layer);
-      }
-      System.err.println("[MODEL MANAGER] oui 3.2");
-      model.setCustomLayers(layers);
-    }
-
-    System.err.println("[MODEL MANAGER] oui 4");
+    System.err.println("[MODEL MANAGER] add model 3");
 
     model.setVotes(0);
     model.setAdded(new Date());
     model.setLastModified(new Date());
     model.setAuthor(user);
 
-    System.err.println("[MODEL MANAGER] oui 5");
+    System.err.println("[MODEL MANAGER] add model 4");
 
     try {
       dao.addModel(model);
@@ -77,19 +61,24 @@ public class ModelManager implements IModelManager {
       System.err.println("[MODEL MANAGER] Add model error "+e.getMessage());
     }
 
-    System.err.println("[MODEL MANAGER] oui 6");
+    System.err.println("[MODEL MANAGER] add model 5");
     
     return model.getId();
   }
 
   @Override
   public void addFile(MultipartFile file, long id, User user) throws Exception {
+    System.err.println("[MODEL MANAGER] add model file 1");
     Model model = dao.findModel(id);
     if (model == null)
       throw new Exception("Unknown model");
+    System.err.println("[MODEL MANAGER] add model file 2");
     model.setFile(file.getBytes());
+    System.err.println("[MODEL MANAGER] add model file 3");
     model.setFileType(file.getContentType());
+    System.err.println("[MODEL MANAGER] add model file 4");
     dao.updateModel(model);
+    System.err.println("[MODEL MANAGER] add model file 5");
   }
 
   @Override
@@ -170,15 +159,21 @@ public class ModelManager implements IModelManager {
   }
 
   @Override
-  public void addLayerFile(MultipartFile file, long id, User user) throws Exception {
-    CustomLayer layer = dao.findLayer(id);
-    if (layer == null)
-      throw new Exception("Unknown layer");
-    if (!isLayerAuthor(layer, user))
+  public void addLayerFile(MultipartFile file, long modelId, String name, User user) throws Exception {
+    Model model = dao.findModel(modelId);
+    if (model == null)
+      throw new Exception("Unknown model");
+    if (!isModelAuthor(model, user))
       throw new Exception("Not the author");
+
+    CustomLayer layer = new CustomLayer();
+    layer.setName(name);
     layer.setFile(file.getBytes());
+    layer.setModel(model);
 
-    dao.updateLayer(layer);
+    model.getCustomLayers().add(layer);
+
+    dao.updateModel(model);
   }
 
   private boolean isLayerAuthor(CustomLayer layer, User user) {
diff --git a/mozen/src/main/java/mozen/model/Model.java b/mozen/src/main/java/mozen/model/Model.java
index c157c9c012e47d88279e89f9448dee7406e781c8..886e26635442de7f5ea997ca56a3390c304edfa3 100644
--- a/mozen/src/main/java/mozen/model/Model.java
+++ b/mozen/src/main/java/mozen/model/Model.java
@@ -73,16 +73,16 @@ public class Model implements Serializable{
   private String fileType;
 
   @Basic
-  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
   private User author;
 
   @Basic
-  @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
+  @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
   @JoinTable(name = "model_tag")
   private Set<Tag> tags;
 
   @Basic
-  @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
+  @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
   @JoinTable(name = "model_customLayers")
   private Set<CustomLayer> customLayers;
 
diff --git a/mozen/src/main/java/mozen/model/Tag.java b/mozen/src/main/java/mozen/model/Tag.java
index 2ec9ef754e449a17046febb2e1cb117087b34282..d9a07807e3bc0c6684f292a5d7c36010b32a5f2c 100644
--- a/mozen/src/main/java/mozen/model/Tag.java
+++ b/mozen/src/main/java/mozen/model/Tag.java
@@ -27,7 +27,7 @@ public class Tag implements Serializable{
   private Long id;
 
   @Basic
-  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+  @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
   private TagCategory category;
   
   @Basic
@@ -35,7 +35,7 @@ public class Tag implements Serializable{
   private String name;
 
   @Basic
-  @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+  @ManyToMany(fetch = FetchType.LAZY)
   private Set<Model> models;
 
   public Tag() {
diff --git a/mozen/src/main/java/mozen/model/User.java b/mozen/src/main/java/mozen/model/User.java
index 14330d254b7c627e1e60136a243d7850abda06f3..eb80be64451467d2b2600d5ab96580c5928ea088 100644
--- a/mozen/src/main/java/mozen/model/User.java
+++ b/mozen/src/main/java/mozen/model/User.java
@@ -58,7 +58,7 @@ public class User implements Serializable{
   private Role role;
   
   @Basic
-  @OneToMany(mappedBy = "author", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+  @OneToMany(mappedBy = "author", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
   @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
   private Set<Model> models;
 
diff --git a/mozen/src/main/java/mozen/utils/DatabaseFiller.java b/mozen/src/main/java/mozen/utils/DatabaseFiller.java
index d62b0155c6ec119edcc8c9cb1fa6c79f8fc0688a..5d8f692baadad8b68e4147555cda6baf94c31292 100644
--- a/mozen/src/main/java/mozen/utils/DatabaseFiller.java
+++ b/mozen/src/main/java/mozen/utils/DatabaseFiller.java
@@ -1,5 +1,9 @@
 package mozen.utils;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
@@ -53,29 +57,34 @@ public class DatabaseFiller {
 
     Model m1 = new Model();
     m1.setAuthor(u1);
-    m1.setName("model 1");
-    m1.setShortDescription("short description 1");
-    m1.setLongDescription("# README \n model 1");
+    m1.setName("Model Testo");
+    m1.setShortDescription("Short description for model testo");
+    m1.setLongDescription("# README \n model testo");
     m1.setVotes(0);
     m1.setAdded(new Date());
     m1.setLastModified(new Date());
 
-    Set<Tag> m1tags = new HashSet<Tag>();
-    Tag t1 = new Tag();
+    /*Set<Tag> m1tags = new HashSet<Tag>();
+
     TagCategory ca1 = new TagCategory();
     ca1.setName("Layer");
+
+    Tag t1 = new Tag();
     t1.setCategory(ca1);
     t1.setName("Conv2D");
 
-    Tag t2 = new Tag();
     TagCategory ca2 = new TagCategory();
     ca2.setName("Architecture");
+
+    Tag t2 = new Tag();
     t2.setCategory(ca2);
     t2.setName("VGG19");
 
     m1tags.add(t1);
     m1tags.add(t2);
     m1.setTags(m1tags);
+    */
+    m1.setTags(tagLoader("tags.txt"));
 
     Set<CustomLayer> m1layers = new HashSet<CustomLayer>();
     CustomLayer l1 = new CustomLayer();
@@ -94,4 +103,37 @@ public class DatabaseFiller {
     daoModel.addModel(m1);
   }
 
+  Set<Tag> tagLoader(String filePath) {
+    Set<Tag> tags = new HashSet<Tag>();
+
+    File file = new File(filePath);
+    FileReader fr;
+    try {
+      fr = new FileReader(file);
+      BufferedReader br = new BufferedReader(fr);
+      String line;
+      while ((line = br.readLine()) != null) {
+        System.out.println("[DB FILLER] adding category "+line);
+        TagCategory category = new TagCategory();
+        category.setName(line);
+        line = br.readLine();
+        while (!line.equals("#")) {
+          System.out.println("[DB FILLER] adding tag "+line+" to "+category.getName());
+          Tag tag = new Tag();
+          tag.setCategory(category);
+          tag.setName(line);
+          
+          tags.add(tag);
+
+          line = br.readLine();
+        }
+      }
+      fr.close();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }   
+
+    return tags;
+  }
+
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/web/ModelController.java b/mozen/src/main/java/mozen/web/ModelController.java
index fc8e8eb7cb28039a99a423000353794ee9a9078f..5506252be9153e264354295aaed45c1ff81b90d3 100644
--- a/mozen/src/main/java/mozen/web/ModelController.java
+++ b/mozen/src/main/java/mozen/web/ModelController.java
@@ -127,7 +127,7 @@ public class ModelController {
   }
 
   @PostMapping("/upload")
-  public ResponseEntity<ResponseMessage> uploadModelFile(@RequestParam(value = "id", required = true) Long id, @RequestParam("file") MultipartFile file) {
+  public ResponseEntity<ResponseMessage> uploadModelFile(@RequestParam("file") MultipartFile file, @RequestParam(value = "id", required = true) Long id) {
     ResponseMessage response = new ResponseMessage(false, "");
     User user = getUser();
     if(user == null) {
@@ -137,6 +137,7 @@ public class ModelController {
     }
   
     try {
+      System.err.println("[MODEL CONTROLLER] model file upload n:"+file.getName());
       modelManager.addFile(file, id, user);
     } catch (Exception e) {
       response.setError(true);
@@ -164,6 +165,30 @@ public class ModelController {
     return ResponseEntity.ok(response);
   }
 
+  @PostMapping("/uploadLayer")
+  public ResponseEntity<ResponseMessage> uploadLayerFile(
+    @RequestParam("file") MultipartFile file, 
+    @RequestParam(value = "id", required = true) Long id,
+    @RequestParam(value = "name", required = true) String name) {
+    ResponseMessage response = new ResponseMessage(false, "");
+    User user = getUser();
+    if(user == null) {
+      response.setError(true);
+      response.setMessage("User unknown");
+      return ResponseEntity.ok(response);
+    }
+  
+    try {
+      System.err.println("[MODEL CONTROLLER] layer file upload f:"+file.getName()+" n:"+name);
+      modelManager.addLayerFile(file, id, name, user);
+    } catch (Exception e) {
+      response.setError(true);
+      response.setMessage(e.getMessage());
+    }
+
+    return ResponseEntity.ok(response);
+  }
+
   private User getUser() {
     Authentication auth = SecurityContextHolder.getContext().getAuthentication();
 
diff --git a/tags.txt b/tags.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9a19513ec0dd2a421cd222844d6f8dbf47157eba
--- /dev/null
+++ b/tags.txt
@@ -0,0 +1,31 @@
+Task
+Classification
+#
+Dataset
+Cifar10
+Cifar100
+SVHN
+MNIST
+#
+Architecture
+VGG19
+Lenet
+Fully connected 500
+Resnet 20
+Resnet 50
+Tensor Train base
+#
+Layers
+Dense
+Conv2D
+Batchnorm
+MaxPooling
+#
+Other
+(4096x4096)
+(2048x2048)
+seed:1
+seed:2
+seed:3
+(deprecated)
+#