diff --git a/mozen/src/main/java/mozen/auth/JwtAuthenticationFilter.java b/mozen/src/main/java/mozen/auth/JwtAuthenticationFilter.java
index 934baad45cba152a460de9d159c2c8a3a043de03..8fa35612860061c588d06f2ad168f136a267bade 100644
--- a/mozen/src/main/java/mozen/auth/JwtAuthenticationFilter.java
+++ b/mozen/src/main/java/mozen/auth/JwtAuthenticationFilter.java
@@ -17,7 +17,8 @@ import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
-import mozen.model.LoginMessage;
+import mozen.messages.LoginMessage;
+import mozen.messages.ResponseMessage;
 import mozen.utils.JwtUtils;
 
 public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter{
@@ -46,9 +47,8 @@ public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilte
   protected void successfulAuthentication(HttpServletRequest req, HttpServletResponse res, FilterChain chain, Authentication auth) 
   throws IOException, ServletException {
     User user = (User) auth.getPrincipal();
-
     String token = JwtUtils.generateToken(user.getUsername());
-    
-      res.addHeader("Authorization", "Bearer " + token);
+    res.getWriter().write(new ObjectMapper().writeValueAsString(new ResponseMessage(false, token)));
+    // res.addHeader("Authorization", "Bearer " + token);
   }
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/IModelDao.java b/mozen/src/main/java/mozen/business/IModelDao.java
index 839ca7f9f1046beaedeea0baed50637140d09cf3..96b56d5f134e71b2df74c0d5953acab43c63dfe0 100644
--- a/mozen/src/main/java/mozen/business/IModelDao.java
+++ b/mozen/src/main/java/mozen/business/IModelDao.java
@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import mozen.model.CustomLayer;
 import mozen.model.Model;
+import mozen.model.Tag;
 import mozen.model.TagCategory;
 
 public interface IModelDao {
@@ -15,7 +16,10 @@ public interface IModelDao {
   void updateLayer(CustomLayer l);
   void removeLayer(long id);
 
+  void addTag(Tag tag);
   Collection<TagCategory> getTags();
+  Tag getTagByName(String name);
+  TagCategory getTagCategory(long id);
 
   Model findModel(long id);
   Collection<Model> findModelsByName(String name);
diff --git a/mozen/src/main/java/mozen/business/IModelManager.java b/mozen/src/main/java/mozen/business/IModelManager.java
index 03ce64da871c57aa9a130d3b6c882d95a9fe679c..7607daad2fdae48c3b427d381ceb031e556c3f5c 100644
--- a/mozen/src/main/java/mozen/business/IModelManager.java
+++ b/mozen/src/main/java/mozen/business/IModelManager.java
@@ -4,14 +4,16 @@ import java.util.Collection;
 
 import org.springframework.web.multipart.MultipartFile;
 
+import mozen.messages.ModelMessage;
+import mozen.messages.TagMessage;
 import mozen.model.CustomLayer;
 import mozen.model.Model;
 import mozen.model.TagCategory;
 import mozen.model.User;
 
 public interface IModelManager {
-  Long addModel(Model m, User user) throws Exception;
-  void updateModel(Model m, long id, User user) throws Exception;
+  Long addModel(ModelMessage message, User user) throws Exception;
+  void updateModel(Model model, long id, User user) throws Exception;
   void removeModel(long id, User user) throws Exception;
 
   Long addLayer(long modelId, CustomLayer layer, User user) throws Exception;
@@ -21,6 +23,8 @@ public interface IModelManager {
   void addFile(MultipartFile file, long id, User user) throws Exception;
   void addLayerFile(MultipartFile file, long id, User user) throws Exception;
 
+  void addTag(TagMessage message);
+
   Model getModel(long id);
   Collection<TagCategory> getTags();
   Collection<Model> findModel(String name);
diff --git a/mozen/src/main/java/mozen/business/IUserManager.java b/mozen/src/main/java/mozen/business/IUserManager.java
index 072835b9477a7c53051308cfc9f11c75b356d84d..5129f21e326f0727e560b12fcd9af1b8de377605 100644
--- a/mozen/src/main/java/mozen/business/IUserManager.java
+++ b/mozen/src/main/java/mozen/business/IUserManager.java
@@ -1,6 +1,6 @@
 package mozen.business;
 
-import mozen.model.SignupMessage;
+import mozen.messages.SignupMessage;
 import mozen.model.User;
 
 public interface IUserManager {
diff --git a/mozen/src/main/java/mozen/business/ModelDao.java b/mozen/src/main/java/mozen/business/ModelDao.java
index 82c0feeb2067e991fd5281d3ee425485add9f1f7..2e2d8e17057f1297daa811216250f06b58c42e98 100644
--- a/mozen/src/main/java/mozen/business/ModelDao.java
+++ b/mozen/src/main/java/mozen/business/ModelDao.java
@@ -12,6 +12,7 @@ import org.springframework.stereotype.Repository;
 
 import mozen.model.CustomLayer;
 import mozen.model.Model;
+import mozen.model.Tag;
 import mozen.model.TagCategory;
 
 @Repository
@@ -44,9 +45,9 @@ public class ModelDao implements IModelDao {
 
   @Override
   public Collection<Model> findModelsByName(String name) {
-    String query = "SELECT m FROM Model m WHERE m.name LIKE :name ORDER BY votes ASC";
+    String query = "SELECT m FROM Model m WHERE lower(m.name) LIKE :name ORDER BY votes ASC";
     TypedQuery<Model> q = em.createQuery(query, Model.class);
-    q.setParameter("name", "%" + name + "%");
+    q.setParameter("name", "%" + name.toLowerCase() + "%");
     try {
       return q.getResultList();
     } catch (Exception e) {
@@ -84,5 +85,27 @@ public class ModelDao implements IModelDao {
   public CustomLayer findLayer(long id) {
     return em.find(CustomLayer.class, id);
   }
+
+  @Override
+  public Tag getTagByName(String name) {
+    String query = "SELECT t FROM Tag t WHERE lower(t.name) LIKE :name";
+    TypedQuery<Tag> q = em.createQuery(query, Tag.class);
+    q.setParameter("name", "%" + name.toLowerCase() + "%");
+    try {
+      return q.getSingleResult();
+    } catch (Exception e) {
+      return null;
+    }
+  }
+
+  @Override
+  public void addTag(Tag tag) {
+    em.persist(tag);
+  }
+
+  @Override
+  public TagCategory getTagCategory(long id) {
+    return em.find(TagCategory.class, id);
+  }
   
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/ModelManager.java b/mozen/src/main/java/mozen/business/ModelManager.java
index 780d2be3c1be186b01c4fea3ebf236a633f680c0..e992894fd4a998d0280f6edea45ae9ad238b8171 100644
--- a/mozen/src/main/java/mozen/business/ModelManager.java
+++ b/mozen/src/main/java/mozen/business/ModelManager.java
@@ -1,13 +1,19 @@
 package mozen.business;
 
 import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import mozen.messages.ModelMessage;
+import mozen.messages.TagMessage;
 import mozen.model.CustomLayer;
 import mozen.model.Model;
+import mozen.model.Tag;
 import mozen.model.TagCategory;
 import mozen.model.User;
 
@@ -18,16 +24,69 @@ public class ModelManager implements IModelManager {
   IModelDao dao;
 
   @Override
-  public Long addModel(Model model, User user) throws Exception {
+  public Long addModel(ModelMessage message, User user) throws Exception {
+    Model model = new Model();
+
+    System.err.println("[MODEL MANAGER] add model n:"+message.getName()+" sd:"+message.getShortDescription()+" ld:"+message.getLongDescription()+" t:"+message.getTags()+" l:"+message.getCustomLayers());
+
+    model.setName(message.getName());
+    model.setShortDescription(message.getShortDescription());
+    model.setLongDescription(message.getLongDescription());
+
+    System.err.println("[MODEL MANAGER] oui 2");
+
+    if (message.getTags() != null) {
+      System.err.println("[MODEL MANAGER] oui 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");
+      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");
+
+    model.setVotes(0);
+    model.setAdded(new Date());
+    model.setLastModified(new Date());
     model.setAuthor(user);
-    dao.addModel(model);
+
+    System.err.println("[MODEL MANAGER] oui 5");
+
+    try {
+      dao.addModel(model);
+    } catch (Exception e) {
+      System.err.println("[MODEL MANAGER] Add model error "+e.getMessage());
+    }
+
+    System.err.println("[MODEL MANAGER] oui 6");
+    
     return model.getId();
   }
 
   @Override
   public void addFile(MultipartFile file, long id, User user) throws Exception {
     Model model = dao.findModel(id);
-    if (model == null) throw new Exception("Unknown model");
+    if (model == null)
+      throw new Exception("Unknown model");
     model.setFile(file.getBytes());
     model.setFileType(file.getContentType());
     dao.updateModel(model);
@@ -36,8 +95,10 @@ public class ModelManager implements IModelManager {
   @Override
   public void updateModel(Model model, long id, User user) throws Exception {
     Model modelToUpdate = dao.findModel(id);
-    if (modelToUpdate == null) throw new Exception("Unknown model");
-    if(!isModelAuthor(modelToUpdate, user)) throw new Exception("Not the author");    
+    if (modelToUpdate == null)
+      throw new Exception("Unknown model");
+    if (!isModelAuthor(modelToUpdate, user))
+      throw new Exception("Not the author");
 
     model.setId(id);
     dao.updateModel(model);
@@ -46,8 +107,10 @@ public class ModelManager implements IModelManager {
   @Override
   public void removeModel(long id, User user) throws Exception {
     Model model = dao.findModel(id);
-    if (model == null) throw new Exception("Unknown model");
-    if(!isModelAuthor(model, user)) throw new Exception("Not the author");
+    if (model == null)
+      throw new Exception("Unknown model");
+    if (!isModelAuthor(model, user))
+      throw new Exception("Not the author");
 
     dao.removeModel(id);
   }
@@ -67,13 +130,15 @@ public class ModelManager implements IModelManager {
   @Override
   public Collection<TagCategory> getTags() {
     return dao.getTags();
-  }  
+  }
 
   @Override
   public Long addLayer(long modelId, CustomLayer layer, 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");
+    if (model == null)
+      throw new Exception("Unknown model");
+    if (!isModelAuthor(model, user))
+      throw new Exception("Not the author");
 
     layer.setModel(model);
     dao.addLayer(layer);
@@ -84,8 +149,10 @@ public class ModelManager implements IModelManager {
   @Override
   public void updateLayer(long id, CustomLayer layer, User user) throws Exception {
     CustomLayer layerToUpdate = dao.findLayer(id);
-    if (layerToUpdate == null) throw new Exception("Unknown layer");
-    if(!isLayerAuthor(layerToUpdate, user)) throw new Exception("Not the author");
+    if (layerToUpdate == null)
+      throw new Exception("Unknown layer");
+    if (!isLayerAuthor(layerToUpdate, user))
+      throw new Exception("Not the author");
 
     layer.setId(id);
     dao.updateLayer(layer);
@@ -94,8 +161,10 @@ public class ModelManager implements IModelManager {
   @Override
   public void removeLayer(long id, User user) throws Exception {
     CustomLayer layer = dao.findLayer(id);
-    if (layer == null) throw new Exception("Unknown layer");
-    if(!isLayerAuthor(layer, user)) throw new Exception("Not the author");
+    if (layer == null)
+      throw new Exception("Unknown layer");
+    if (!isLayerAuthor(layer, user))
+      throw new Exception("Not the author");
 
     dao.removeLayer(id);
   }
@@ -103,10 +172,12 @@ 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)) throw new Exception("Not the author");
+    if (layer == null)
+      throw new Exception("Unknown layer");
+    if (!isLayerAuthor(layer, user))
+      throw new Exception("Not the author");
     layer.setFile(file.getBytes());
- 
+
     dao.updateLayer(layer);
   }
 
@@ -118,4 +189,15 @@ public class ModelManager implements IModelManager {
     return model.getAuthor() == user;
   }
 
+  @Override
+  public void addTag(TagMessage message) {
+    System.err.println("[MODEL MANAGER] add tag n:"+message.getName()+" c:"+message.getCategoryId());
+    TagCategory category = dao.getTagCategory(message.getCategoryId());
+    Tag tag = new Tag();
+    tag.setName(message.getName());
+    tag.setCategory(category);
+
+    dao.addTag(tag);
+  }
+
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/UserManager.java b/mozen/src/main/java/mozen/business/UserManager.java
index fe5a497d81472cd70aa7b8e46b2273412c63418f..87a980c630b476d39fe38524241883dadd6b583d 100644
--- a/mozen/src/main/java/mozen/business/UserManager.java
+++ b/mozen/src/main/java/mozen/business/UserManager.java
@@ -5,7 +5,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import mozen.model.Role;
-import mozen.model.SignupMessage;
+import mozen.messages.SignupMessage;
 import mozen.model.User;
 
 @Service
diff --git a/mozen/src/main/java/mozen/model/LoginMessage.java b/mozen/src/main/java/mozen/messages/LoginMessage.java
similarity index 96%
rename from mozen/src/main/java/mozen/model/LoginMessage.java
rename to mozen/src/main/java/mozen/messages/LoginMessage.java
index 89d97549e933027a493a4db0c229d140231ec65e..e69ad94913bcf153961e80cca71764afea6f5d96 100644
--- a/mozen/src/main/java/mozen/model/LoginMessage.java
+++ b/mozen/src/main/java/mozen/messages/LoginMessage.java
@@ -1,4 +1,4 @@
-package mozen.model;
+package mozen.messages;
 
 import java.io.Serializable;
 
diff --git a/mozen/src/main/java/mozen/messages/ModelMessage.java b/mozen/src/main/java/mozen/messages/ModelMessage.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a3f6d5eaee6ea94bafcc4cb0bf9b0d40ffc169d
--- /dev/null
+++ b/mozen/src/main/java/mozen/messages/ModelMessage.java
@@ -0,0 +1,76 @@
+package mozen.messages;
+
+import java.io.Serializable;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+public class ModelMessage implements Serializable {
+  private static final long serialVersionUID = 1L;
+  
+  @NotNull
+  @Size(min = 3, max = 30)
+  private String name;
+
+  @Size(min = 0, max = 200)
+  private String shortDescription;
+
+  @Size(min = 0, max = 5000)
+  private String longDescription;
+
+  private String [] tags;
+
+  private String [] customLayers;
+
+  public ModelMessage() {
+  }
+
+  public ModelMessage(String name, String shortDescription, String longDescription, String[] tags, String[] customLayers) {
+    this.name = name;
+    this.shortDescription = shortDescription;
+    this.longDescription = longDescription;
+    this.tags = tags;
+    this.customLayers = customLayers;
+  }
+
+  public String getName() {
+    return this.name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getShortDescription() {
+    return this.shortDescription;
+  }
+
+  public void setShortDescription(String shortDescription) {
+    this.shortDescription = shortDescription;
+  }
+
+  public String getLongDescription() {
+    return this.longDescription;
+  }
+
+  public void setLongDescription(String longDescription) {
+    this.longDescription = longDescription;
+  }
+
+  public String[] getTags() {
+    return this.tags;
+  }
+
+  public void setTags(String[] tags) {
+    this.tags = tags;
+  }
+
+  public String[] getCustomLayers() {
+    return this.customLayers;
+  }
+
+  public void setCustomLayers(String[] customLayers) {
+    this.customLayers = customLayers;
+  }
+
+}
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/model/ResponseMessage.java b/mozen/src/main/java/mozen/messages/ResponseMessage.java
similarity index 96%
rename from mozen/src/main/java/mozen/model/ResponseMessage.java
rename to mozen/src/main/java/mozen/messages/ResponseMessage.java
index 264393a6f305e68b07f47f951d0d0a3756abdfec..eb70891fa095857c20448b15ecb00a82a5e62225 100644
--- a/mozen/src/main/java/mozen/model/ResponseMessage.java
+++ b/mozen/src/main/java/mozen/messages/ResponseMessage.java
@@ -1,4 +1,4 @@
-package mozen.model;
+package mozen.messages;
 
 import java.io.Serializable;
 
diff --git a/mozen/src/main/java/mozen/model/SignupMessage.java b/mozen/src/main/java/mozen/messages/SignupMessage.java
similarity index 98%
rename from mozen/src/main/java/mozen/model/SignupMessage.java
rename to mozen/src/main/java/mozen/messages/SignupMessage.java
index 816fc862a622bba7cd86bc7cea84d9c082b79fed..965a97230eeb56c609523c19cf03c130c962e5e1 100644
--- a/mozen/src/main/java/mozen/model/SignupMessage.java
+++ b/mozen/src/main/java/mozen/messages/SignupMessage.java
@@ -1,4 +1,4 @@
-package mozen.model;
+package mozen.messages;
 
 import java.io.Serializable;
 
diff --git a/mozen/src/main/java/mozen/messages/TagMessage.java b/mozen/src/main/java/mozen/messages/TagMessage.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5aa18357bc0a75752a227ed8b8d81220fc9bb66
--- /dev/null
+++ b/mozen/src/main/java/mozen/messages/TagMessage.java
@@ -0,0 +1,36 @@
+package mozen.messages;
+
+import java.io.Serializable;
+
+public class TagMessage implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  private long categoryId;
+  
+  private String name;
+
+  public TagMessage() {
+  }
+
+  public TagMessage(long categoryId, String name) {
+    this.categoryId = categoryId;
+    this.name = name;
+  }
+
+  public long getCategoryId() {
+    return this.categoryId;
+  }
+
+  public void setCategoryId(long categoryId) {
+    this.categoryId = categoryId;
+  }
+
+  public String getName() {
+    return this.name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+}
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/model/Model.java b/mozen/src/main/java/mozen/model/Model.java
index 59f04f0095eb3839b6d425445d26cf8bfe2266aa..c157c9c012e47d88279e89f9448dee7406e781c8 100644
--- a/mozen/src/main/java/mozen/model/Model.java
+++ b/mozen/src/main/java/mozen/model/Model.java
@@ -1,6 +1,7 @@
 package mozen.model;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.Set;
 
 import javax.persistence.Basic;
@@ -17,13 +18,13 @@ import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
-import org.springframework.format.annotation.DateTimeFormat;
-
 @Entity
 @Table
 public class Model implements Serializable{
@@ -50,14 +51,14 @@ public class Model implements Serializable{
   private String longDescription;
 
   @Basic
-	@DateTimeFormat(pattern = "yyyy-mm-dd")
+	@Temporal(TemporalType.DATE)
 	@Column
-  private String added;
+  private Date added;
   
   @Basic
-	@DateTimeFormat(pattern = "yyyy-mm-dd")
+	@Temporal(TemporalType.DATE)
 	@Column
-	private String lastModified;
+	private Date lastModified;
 
   @Basic
 	@Column
@@ -88,7 +89,7 @@ public class Model implements Serializable{
   public Model() {
   }
 
-  public Model(Long id, String name, String shortDescription, String longDescription, String added, String lastModified, int votes, byte[] file, String fileType, User author, Set<Tag> tags, Set<CustomLayer> customLayers) {
+  public Model(Long id, String name, String shortDescription, String longDescription, Date added, Date lastModified, int votes, byte[] file, String fileType, User author, Set<Tag> tags, Set<CustomLayer> customLayers) {
     this.id = id;
     this.name = name;
     this.shortDescription = shortDescription;
@@ -135,19 +136,19 @@ public class Model implements Serializable{
     this.longDescription = longDescription;
   }
 
-  public String getAdded() {
+  public Date getAdded() {
     return this.added;
   }
 
-  public void setAdded(String added) {
+  public void setAdded(Date added) {
     this.added = added;
   }
 
-  public String getLastModified() {
+  public Date getLastModified() {
     return this.lastModified;
   }
 
-  public void setLastModified(String lastModified) {
+  public void setLastModified(Date lastModified) {
     this.lastModified = lastModified;
   }
 
diff --git a/mozen/src/main/java/mozen/model/Tag.java b/mozen/src/main/java/mozen/model/Tag.java
index fb436b9efd80a64dfccf8f9ef7c512f54496491f..2ec9ef754e449a17046febb2e1cb117087b34282 100644
--- a/mozen/src/main/java/mozen/model/Tag.java
+++ b/mozen/src/main/java/mozen/model/Tag.java
@@ -31,7 +31,7 @@ public class Tag implements Serializable{
   private TagCategory category;
   
   @Basic
-	@Column(nullable = false)
+	@Column(nullable = false, unique = true)
   private String name;
 
   @Basic
diff --git a/mozen/src/main/java/mozen/model/TagCategory.java b/mozen/src/main/java/mozen/model/TagCategory.java
index 817426b5454656d4e9f9d55bd3239026cc8021f6..b1e87f3b91cee0cff943fb8cc1c218c4229b7d14 100644
--- a/mozen/src/main/java/mozen/model/TagCategory.java
+++ b/mozen/src/main/java/mozen/model/TagCategory.java
@@ -24,7 +24,7 @@ public class TagCategory implements Serializable{
   private Long id;
 
   @Basic
-	@Column(nullable = false)
+	@Column(nullable = false, unique = true)
   private String name;
 
   @Basic 
diff --git a/mozen/src/main/java/mozen/utils/DatabaseFiller.java b/mozen/src/main/java/mozen/utils/DatabaseFiller.java
index 7078c814c204785a828a7765befe0e29e81c0cef..d62b0155c6ec119edcc8c9cb1fa6c79f8fc0688a 100644
--- a/mozen/src/main/java/mozen/utils/DatabaseFiller.java
+++ b/mozen/src/main/java/mozen/utils/DatabaseFiller.java
@@ -1,11 +1,13 @@
 package mozen.utils;
 
+import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -26,6 +28,9 @@ public class DatabaseFiller {
   @Autowired
   IUserDao daoUser;
 
+  @Autowired
+  private BCryptPasswordEncoder bCryptPasswordEncoder;
+
   @EventListener(ContextRefreshedEvent.class)
   public void onApplicationEvent(ContextRefreshedEvent event) {
     event.getApplicationContext().getBean(DatabaseFiller.class).fillDB();
@@ -36,13 +41,13 @@ public class DatabaseFiller {
     System.err.println("FILLING DB");
     User u1 = new User();
     u1.setEmail("user1@email.com");
-    u1.setPassword("1234");
+    u1.setPassword(bCryptPasswordEncoder.encode("1234"));
     u1.setUsername("user 1");
     u1.setRole(Role.Default);
 
     User u2 = new User();
     u2.setEmail("user2@email.com");
-    u2.setPassword("1234");
+    u2.setPassword(bCryptPasswordEncoder.encode("1234"));
     u2.setUsername("user 2");
     u2.setRole(Role.Admin);
 
@@ -52,8 +57,8 @@ public class DatabaseFiller {
     m1.setShortDescription("short description 1");
     m1.setLongDescription("# README \n model 1");
     m1.setVotes(0);
-    m1.setAdded("1990-05-30");
-    m1.setLastModified("2010-10-24");
+    m1.setAdded(new Date());
+    m1.setLastModified(new Date());
 
     Set<Tag> m1tags = new HashSet<Tag>();
     Tag t1 = new Tag();
diff --git a/mozen/src/main/java/mozen/web/ModelController.java b/mozen/src/main/java/mozen/web/ModelController.java
index e9ec2614ba3ae8ed2c1a19be048bd52066a1cb42..fc8e8eb7cb28039a99a423000353794ee9a9078f 100644
--- a/mozen/src/main/java/mozen/web/ModelController.java
+++ b/mozen/src/main/java/mozen/web/ModelController.java
@@ -2,6 +2,8 @@ package mozen.web;
 
 import java.util.Collection;
 
+import javax.validation.Valid;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.http.HttpHeaders;
@@ -20,16 +22,17 @@ import org.springframework.web.multipart.MultipartFile;
 import mozen.business.IModelManager;
 import mozen.business.IUserManager;
 import mozen.model.Model;
-import mozen.model.ResponseMessage;
+import mozen.messages.ModelMessage;
+import mozen.messages.ResponseMessage;
+import mozen.messages.TagMessage;
 import mozen.model.TagCategory;
 import mozen.model.User;
 
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
-
-
 @RestController
 @RequestMapping("/models")
 @CrossOrigin
@@ -52,7 +55,7 @@ public class ModelController {
   }
 
   @PostMapping("")
-  public ResponseEntity<ResponseMessage> addModel(Model model) {
+  public ResponseEntity<ResponseMessage> addModel(@RequestBody @Valid ModelMessage message) {
     ResponseMessage response = new ResponseMessage(false, "");
     User user = getUser();
     if(user == null) {
@@ -62,7 +65,8 @@ public class ModelController {
     }
 
     try {
-      modelManager.addModel(model, user);
+      long modelId = modelManager.addModel(message, user);
+      response.setMessage(Long.toString(modelId));
     } catch (Exception e) {
       response.setError(true);
       response.setMessage(e.getMessage());
@@ -72,7 +76,7 @@ public class ModelController {
   }
 
   @PutMapping("")
-  public ResponseEntity<ResponseMessage> updateModel(@RequestParam(value = "id", required = true) Long id, Model model) {
+  public ResponseEntity<ResponseMessage> updateModel(@RequestParam(value = "id", required = true) Long id, @RequestBody @Valid Model model) {
     ResponseMessage response = new ResponseMessage(false, "");
     User user = getUser();
     if(user == null) {
@@ -116,6 +120,12 @@ public class ModelController {
     return modelManager.getTags();
   }
 
+  @PostMapping("/tags")
+  public ResponseEntity<ResponseMessage> addTag(@RequestBody @Valid TagMessage message) {
+    modelManager.addTag(message);
+    return ResponseEntity.ok().build();
+  }
+
   @PostMapping("/upload")
   public ResponseEntity<ResponseMessage> uploadModelFile(@RequestParam(value = "id", required = true) Long id, @RequestParam("file") MultipartFile file) {
     ResponseMessage response = new ResponseMessage(false, "");
diff --git a/mozen/src/main/java/mozen/web/UserController.java b/mozen/src/main/java/mozen/web/UserController.java
index 8fb2965a27efdbcead00ba337b19673eb98e598b..227b8487c4975a0e59cb1687881e0c2bcee721da 100644
--- a/mozen/src/main/java/mozen/web/UserController.java
+++ b/mozen/src/main/java/mozen/web/UserController.java
@@ -14,8 +14,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import mozen.business.IUserManager;
-import mozen.model.ResponseMessage;
-import mozen.model.SignupMessage;
+import mozen.messages.ResponseMessage;
+import mozen.messages.SignupMessage;
 import mozen.model.User;
 import mozen.utils.JwtUtils;