diff --git a/mozen/src/main/java/mozen/auth/WebSecurity.java b/mozen/src/main/java/mozen/auth/WebSecurity.java
index 014bb262e4f009c33325be00137db523b436da50..259f5e869185701a10bd26243d075b0da0474187 100644
--- a/mozen/src/main/java/mozen/auth/WebSecurity.java
+++ b/mozen/src/main/java/mozen/auth/WebSecurity.java
@@ -4,6 +4,7 @@ import java.util.Arrays;
 import java.util.Collections;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
 import org.springframework.context.annotation.Bean;
 import org.springframework.http.HttpMethod;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
@@ -26,18 +27,27 @@ public class WebSecurity extends WebSecurityConfigurerAdapter{
 
   @Override
   protected void configure(HttpSecurity http) throws Exception {
-    http.cors().and().csrf().disable().authorizeRequests()
+    http
+      .httpBasic()
+    .and()
+      .csrf().disable()
+      .cors()
+    .and()
+      .authorizeRequests() 
+        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
         .antMatchers(HttpMethod.POST, "/user/signup").permitAll()
         .antMatchers(HttpMethod.GET, "/search").permitAll()
         .antMatchers(HttpMethod.GET, "/models").permitAll()
         .antMatchers(HttpMethod.GET, "/models/tags").permitAll()
+        .antMatchers(HttpMethod.GET, "/models/download").permitAll()
+        .antMatchers(HttpMethod.GET, "/models/downloadLayer").permitAll()
         .antMatchers(HttpMethod.GET, "/user/list").hasRole("ADMIN")
         .antMatchers(HttpMethod.GET, "/model/list").hasRole("ADMIN")
         .anyRequest().authenticated()
-        .and()
-        .addFilter(new JwtAuthenticationFilter(authenticationManager()))
-        .addFilter(new JwtAuthorizationFilter(authenticationManager()))
-        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
+    .and()
+      .addFilter(new JwtAuthenticationFilter(authenticationManager()))
+      .addFilter(new JwtAuthorizationFilter(authenticationManager()))
+      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
   }
 
   @Override
diff --git a/mozen/src/main/java/mozen/business/IModelManager.java b/mozen/src/main/java/mozen/business/IModelManager.java
index b559eb864cd679ca60f605c77fea23bd25393160..1823817ecf5170f0717a6a522271782d360725b5 100644
--- a/mozen/src/main/java/mozen/business/IModelManager.java
+++ b/mozen/src/main/java/mozen/business/IModelManager.java
@@ -6,6 +6,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import mozen.messages.ModelMessage;
 import mozen.messages.TagMessage;
+import mozen.model.CustomLayer;
 import mozen.model.Model;
 import mozen.messages.SearchResult;
 import mozen.model.TagCategory;
@@ -25,7 +26,8 @@ public interface IModelManager {
   Model getModel(long id);
   Collection<Model> getModels();
   Collection<TagCategory> getTags();
-  SearchResult findModel(String name, int page, int size, String sort);
+  CustomLayer getLayer(long id);
 
+  SearchResult findModel(String name, int page, int size, String sort);
   SearchResult findModelWithTags(String name, int page, int size, String sort, Collection<String> tags);
 }
\ 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 dcaeed6ae7bceb31d799f7bf878bb36b62fb8f66..48897ec71672fc9d685b668db7a9f2dff17b94f8 100644
--- a/mozen/src/main/java/mozen/business/ModelManager.java
+++ b/mozen/src/main/java/mozen/business/ModelManager.java
@@ -51,7 +51,7 @@ public class ModelManager implements IModelManager {
     if (message.getTags() != null) {
       Set<Tag> tags = new HashSet<Tag>();
       for (String tagName : message.getTags()) {
-        Tag tag = tagRepo.findByName(tagName).get(0);
+        Tag tag = tagRepo.findByName(tagName);
         tags.add(tag);
       }
       model.setTags(tags);
@@ -77,6 +77,8 @@ public class ModelManager implements IModelManager {
 
     if (model == null)
       throw new Exception("Unknown model");
+    if (!isModelAuthor(model, user))
+      throw new Exception("Not the author");
 
     model.setFile(file.getBytes());
     model.setFileType(file.getContentType());
@@ -149,6 +151,7 @@ public class ModelManager implements IModelManager {
     CustomLayer layer = new CustomLayer();
     layer.setName(name);
     layer.setFile(file.getBytes());
+    layer.setFileType(file.getContentType());
     layer.setModel(model);
 
     model.getCustomLayers().add(layer);
@@ -183,8 +186,6 @@ public class ModelManager implements IModelManager {
 
   @Override
   public Collection<TagCategory> getTags() {
-    // Collection<TagCategory> categories = new ArrayList<TagCategory>();
-    // tagCategoryRepo.findAll().forEach(categories::add);
     return tagCategoryRepo.findAll();
   }
 
@@ -226,4 +227,9 @@ public class ModelManager implements IModelManager {
     return modelRepo.findAll();
   }
 
+  @Override
+  public CustomLayer getLayer(long id) {
+    return layerRepo.findById(id).get();
+  }
+
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/TagRepository.java b/mozen/src/main/java/mozen/business/TagRepository.java
index 219a5797e2deaae9a8fed42c45b3a32e87a3975c..5e1038f2921f829c2347f735d601c0c459da0662 100644
--- a/mozen/src/main/java/mozen/business/TagRepository.java
+++ b/mozen/src/main/java/mozen/business/TagRepository.java
@@ -8,6 +8,6 @@ import org.springframework.data.repository.CrudRepository;
 import mozen.model.Tag;
 
 public interface TagRepository extends CrudRepository<Tag, Long>{
-  List<Tag> findByName(String name);
+  Tag findByName(String name);
   List<Tag> findByNameIn(Collection<String> name);
 }
\ 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 6cbfb6187f113416acbb8ed7efe02aaac593c81d..fb71d8e5c3c96031e31f8e7fe4b9a3703169f587 100644
--- a/mozen/src/main/java/mozen/business/UserManager.java
+++ b/mozen/src/main/java/mozen/business/UserManager.java
@@ -63,7 +63,7 @@ public class UserManager implements IUserManager {
 
   @Override
   public User getUserByUsername(String username) {
-    return repo.findByUsername(username).get(0);
+    return repo.findByUsername(username);
   }
 
   @Override
diff --git a/mozen/src/main/java/mozen/business/UserRepository.java b/mozen/src/main/java/mozen/business/UserRepository.java
index e02411aab4fdff33fb1df96e30c96fe61905373a..dbbe318917a6aeff0e0546ab6fa70882e0697171 100644
--- a/mozen/src/main/java/mozen/business/UserRepository.java
+++ b/mozen/src/main/java/mozen/business/UserRepository.java
@@ -7,6 +7,6 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 import mozen.model.User;
 
 public interface UserRepository extends PagingAndSortingRepository<User, Long> {
-  List<User> findByUsername(String username);
+  User findByUsername(String username);
   List<User> findAll();
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/model/CustomLayer.java b/mozen/src/main/java/mozen/model/CustomLayer.java
index 752c58a3cd6362989a27cf2c1d5a22a7049e5d49..071cb7f2d2f9082bf53bc09b4e2072b1b973597e 100644
--- a/mozen/src/main/java/mozen/model/CustomLayer.java
+++ b/mozen/src/main/java/mozen/model/CustomLayer.java
@@ -30,9 +30,13 @@ public class CustomLayer implements Serializable{
   private String name;
   
   @Lob
-	@Column
+	@Column(columnDefinition="BLOB")
   private byte[] file;
 
+  @Basic
+	@Column
+  private String fileType;
+
   @Basic
   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   private Model model;
@@ -40,10 +44,11 @@ public class CustomLayer implements Serializable{
   public CustomLayer() {
   }
 
-  public CustomLayer(Long id, String name, byte[] file, Model model) {
+  public CustomLayer(Long id, String name, byte[] file, String fileType, Model model) {
     this.id = id;
     this.name = name;
     this.file = file;
+    this.fileType = fileType;
     this.model = model;
   }
 
@@ -72,6 +77,15 @@ public class CustomLayer implements Serializable{
     this.file = file;
   }
 
+  @JsonIgnore
+  public String getFileType() {
+    return this.fileType;
+  }
+
+  public void setFileType(String fileType) {
+    this.fileType = fileType;
+  }
+
   @JsonIgnore
   public Model getModel() {
     return this.model;
diff --git a/mozen/src/main/java/mozen/model/Model.java b/mozen/src/main/java/mozen/model/Model.java
index 886e26635442de7f5ea997ca56a3390c304edfa3..70eab80d5fa47d69c8c0dae3da63c179434c3e44 100644
--- a/mozen/src/main/java/mozen/model/Model.java
+++ b/mozen/src/main/java/mozen/model/Model.java
@@ -65,7 +65,7 @@ public class Model implements Serializable{
   private int votes;
 
   @Lob
-	@Column
+	@Column(columnDefinition="BLOB")
   private byte[] file;
 
   @Basic
diff --git a/mozen/src/main/java/mozen/web/ModelController.java b/mozen/src/main/java/mozen/web/ModelController.java
index 8a19b405e085f86d97f2b0bcb6e0c8ba856cb348..61a8bea273df4f1ecf61b3cc9375725bb6dba731 100644
--- a/mozen/src/main/java/mozen/web/ModelController.java
+++ b/mozen/src/main/java/mozen/web/ModelController.java
@@ -21,6 +21,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import mozen.business.IModelManager;
 import mozen.business.IUserManager;
+import mozen.model.CustomLayer;
 import mozen.model.Model;
 import mozen.messages.ModelMessage;
 import mozen.messages.ResponseMessage;
@@ -152,7 +153,7 @@ public class ModelController {
     return ResponseEntity.ok(response);
   }
 
-  @PostMapping("/download")
+  @GetMapping("/download")
   public ResponseEntity<?> downloadModelFile(@RequestParam(value = "id", required = true) Long id) {
     ResponseMessage response = new ResponseMessage(false, "");
   
@@ -170,6 +171,24 @@ public class ModelController {
     return ResponseEntity.ok(response);
   }
 
+  @GetMapping("/downloadLayer")
+  public ResponseEntity<?> downloadLayerFile(@RequestParam(value = "id", required = true) Long id) {
+    ResponseMessage response = new ResponseMessage(false, "");
+  
+    try {
+      CustomLayer layer = modelManager.getLayer(id);
+      return ResponseEntity.ok()
+        .contentType(MediaType.parseMediaType(layer.getFileType()))
+        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + layer.getName() + "\"")
+        .body(new ByteArrayResource(layer.getFile()));
+    } catch (Exception e) {
+      response.setError(true);
+      response.setMessage(e.getMessage());
+    }
+
+    return ResponseEntity.ok(response);
+  }
+
   @PostMapping("/uploadLayer")
   public ResponseEntity<ResponseMessage> uploadLayerFile(
     @RequestParam("file") MultipartFile file, 
@@ -198,6 +217,7 @@ public class ModelController {
     Authentication auth = SecurityContextHolder.getContext().getAuthentication();
 
     if (!(auth instanceof AnonymousAuthenticationToken)) {
+      if (auth.getPrincipal() instanceof org.springframework.security.core.userdetails.User) return null;
       String username = (String) auth.getPrincipal();
       return userManager.getUserByUsername(username);
     } else {
diff --git a/mozen/src/main/resources/application.properties b/mozen/src/main/resources/application.properties
index 46f90db90f686d363ae138350cd9ac5935fb7d64..8904fb7a6e3894b9a500295f6dc4695c0968b145 100644
--- a/mozen/src/main/resources/application.properties
+++ b/mozen/src/main/resources/application.properties
@@ -1,10 +1,19 @@
 
 server.port=8181
 
-datasource.driverName=org.hsqldb.jdbcDriver
-datasource.url=jdbc:hsqldb:mem:mydb
-datasource.username=SA
-datasource.password=
+# H2
+spring.datasource.driverClassName=org.hsqldb.jdbcDriver
+spring.datasource.url=jdbc:hsqldb:mem:mydb
+spring.datasource.username=SA
+spring.datasource.password=
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
+
+# MySQL
+#spring.datasource.url=jdbc:mysql://localhost:3306/test
+#spring.datasource.username=dbuser
+#spring.datasource.password=dbpass
+#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
 
 spring.jackson.serialization.fail-on-empty-beans=false